1) Para permitir interoperabilidade com outras linguagens, é importante não usar nomes de métodos em C# que variem apenas no case (letras maiúsculas/minúsculas), como "Teste" e "TESTE".
2) Um método sem modificador é privado por padrão.
3) Métodos do tipo void podem ter return (que, no caso, não é acompanhado de nenhuma expressão).
4) O compilador não avisa caso o nome de um parâmetro ou variável local de um método seja igual a um campo de uma classe.
5) A passagem de parâmetros ref e out aceita apenas left-values (como nomes de variáveis).
6) Uma variável passada como parâmetro ref/por valor precisa ter sido inicializada (em out isso não é obrigatório, mas pode acontecer).
7) A palavra-chave ref/out deve preceder o nome do parâmetro ref/out na chamada do método.
8) Um parâmetro out deve ser atribuído a um valor no método que o define.
9) Parâmetro do tipo params não pode ser ref ou out, apenas por valor.
10) O parâmetro params deve ser um "single dimensional array". O código abaixo também compila OK:
void m(params int[][] x) {...}
11) A chamada de um método que possui parâmetro params pode ser feita com um array ou através de uma lista separada por vírgulas. No caso do array, é possível que o array na passagem seja um subtipo do array definido no argumento params método.
12) Argumento params tem que ser o último da lista de parametros formais
13) O modificador do parâmetro (out/ref) influencia overloading. Os métodos abaixo são overloaded e compilam OK:
void test(int x) {}
void test(ref int x) {}
14) O nome dos parâmetros e o tipo de retorno do método não influencia overloading.
[]s
-- AFurtado