Does C # 4.0 e uma combinação de parâmetros opcionais e sobrecargas dar-lhe um aviso sobre a ambiguidade?

StackOverflow https://stackoverflow.com/questions/1211203

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?

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top