¿C # 4.0 y una combinación de parámetros opcionales y sobrecargas le dan una advertencia sobre la ambigüedad?

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

Pregunta

Comencé a leer la versión de acceso temprano de Jon Skeet de su libro, que contiene secciones en C # 4.0, y una cosa me llamó la atención. Lamentablemente, no tengo Visual Studio 2010 disponible, así que pensé en preguntar aquí y ver si alguien sabía la respuesta.

Si tengo el siguiente código, una mezcla de código existente y un código nuevo:

public void SomeMethod(Int32 x, Int32 y) { ... }

public void SomeMethod(Int32 x, Int32 y, Int32 z = 0) { ... }

¿Se quejará el compilador en el sitio de definición o en el sitio de la llamada sobre una posible ambigüedad?

Por ejemplo, ¿qué hará realmente este fragmento de código?

SomeClass sc = new SomeClass();
sc.SomeMethod(15, 23);

¿Se compilará? ¿Llamará al que no tiene el parámetro z, o llamará al que no tiene el parámetro z?

¿Fue útil?

Solución

Se compilará sin advertencias y elegirá la primera sobrecarga.

Con la introducción de parámetros opcionales y con nombre, el mecanismo de resolución de sobrecarga de C # se ha vuelto realmente complicado. Sin embargo, en este caso específico, tiene sentido. Como de costumbre, el compilador elegirá la sobrecarga más específica que coincida con los argumentos.

No creo que este caso específico sea muy diferente de C # 1.0:

public void SomeMethod(Int32 x, Int32 y) { } 
public void SomeMethod(Int32 x, Int32 y, params Int32[] z) { }

que funciona de manera idéntica (en términos de resolución de sobrecarga).

Respuesta de seguimiento: no lo creo. Me temo que tendrá que especificar manualmente el argumento predeterminado en la llamada al método. Sin embargo, si el parámetro x o y tiene un nombre diferente como:

public void SomeMethod(Int32 x, Int32 y) { } 
public void SomeMethod(Int32 t, Int32 y, Int32 z = 0) { }

puede elegir la segunda sobrecarga con:

obj.SomeMethod(t: 10, y: 20);

Otros consejos

Esto está cubierto en la " Resolución de sobrecarga " sección del capítulo.

Cuando el compilador tiene dos opciones iguales para elegir, usará una sobrecarga que no necesita usar ningún parámetro opcional no suministrado en lugar de uno que sí lo tenga, pero es una elección binaria estricta. Si tiene que elegir entre una sobrecarga con un parámetro opcional no suministrado y dos, considerará que es una situación ambigua.

Para responder a su comentario de seguimiento, no conozco ninguna forma de forzar una sobrecarga con el parámetro opcional que se utilizará sin especificarlo. No puede usar ninguno de estos, por ejemplo:

// Both invalid
sc.SomeMethod(15, 23, );
sc.SomeMethod(15, 23, z:)

Si, sin embargo, sus métodos utilizan nombres de parámetros diferentes, podría hacerlo entonces:

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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top