Does C # 4.0 e uma combinação de parâmetros opcionais e sobrecargas dar-lhe um aviso sobre a ambiguidade?
-
06-07-2019 - |
Pergunta
Eu comecei a ler a versão de acesso inicial de Jon Skeet de seu livro, que contém seções sobre C # 4.0, e uma coisa me atingiu. Infelizmente eu não tenho Visual Studio 2010 disponível então eu pensei que eu tinha acabado de pedir aqui em vez e ver se alguém sabia a resposta.
Se eu tiver o código a seguir, uma mistura de código existente e novo código:
public void SomeMethod(Int32 x, Int32 y) { ... }
public void SomeMethod(Int32 x, Int32 y, Int32 z = 0) { ... }
Será que o compilador reclamar ou no local de definição ou o site de chamada sobre a possível ambigüidade?
Por exemplo, o que vai este pedaço de código realmente fazer?
SomeClass sc = new SomeClass();
sc.SomeMethod(15, 23);
Será que vai compilar? Será que vai chamar o um sem o parâmetro z, ou vai chamar aquele com o parâmetro z?
Solução
Ele irá compilar sem avisos e vai escolher a primeira sobrecarga.
Com a introdução de parâmetros opcionais e nomeados, o mecanismo de resolução de sobrecarga de C # tornou-se realmente complicado. Neste caso específico, não faz sentido no entanto. Como de costume, o compilador irá escolher o mais sobrecarga específica que coincide com os argumentos.
Eu não acredito que neste caso específico é muito diferente do C # 1.0:
public void SomeMethod(Int32 x, Int32 y) { }
public void SomeMethod(Int32 x, Int32 y, params Int32[] z) { }
que funciona de forma idêntica (em termos de resolução de sobrecarga).
Acompanhamento resposta: Eu não penso assim. Eu tenho medo que você vai ter que especificar manualmente o argumento padrão na chamada do método. No entanto, se o parâmetro x
ou y
tinha um nome diferente, como:
public void SomeMethod(Int32 x, Int32 y) { }
public void SomeMethod(Int32 t, Int32 y, Int32 z = 0) { }
Você pode escolher a segunda sobrecarga com:
obj.SomeMethod(t: 10, y: 20);
Outras dicas
Este é abordado na seção "Resolução de sobrecarga" do capítulo.
Quando o compilador tem duas opções de outra forma-iguais para escolher, ele vai usar uma sobrecarga que não precisa usar quaisquer parâmetros opcionais não suprida de preferência a um que faz, mas é uma escolha binária rigoroso. Se tiver que escolher entre uma sobrecarga com um parâmetro não suprida opcional e dois, ele vai considerar que para ser uma situação ambígua.
Para responder seu comentário de acompanhamento, eu não conheço nenhuma maneira de forçar uma sobrecarga com o parâmetro opcional para ser usado sem especificar isso. Você não pode usar qualquer um destes, por exemplo:
// Both invalid
sc.SomeMethod(15, 23, );
sc.SomeMethod(15, 23, z:)
Se, no entanto, seus métodos utilizados diferentes nomes de parâmetro, você pode fazer isso, então:
public void SomeMethod(Int32 x, Int32 y) { ... }
public void SomeMethod(Int32 a, Int32 b, Int32 c = 0) { ... }
sc.SomeMethod(a: 15, b: 23); // Calls second method