2012-02-24 11 views
6

Esta no es una pregunta sobre la práctica de codificación adecuada, solo estoy trabajando en la semántica. Digamos que tengo los siguientes constructores ...C#: ¿Sobrecarga de constructores con parámetros opcionales y argumentos con nombre?

public FooClass(string name = "theFoo") 
{ fooName = name; } 

public FooClass(string name, int num = 7, bool boo = true) : this(name) 
{ fooNum = num; fooBool = boo; } 

es posible el uso de argumentos con nombre thusly ...?

FooClass foo1 = new FooClass(num:1); 

// donde sólo estoy pasando un argumento con nombre, confiando en los opcionales para cuidar del resto

o llamar al constructor FooClass (cadena, int, bool) sin argumentos? como en ...

FooClass foo2 = new FooClass(); 
+7

¿Qué tal, inténtelo? Tienes el código allí mismo ... ¡dime si funciona! –

+0

bien, debería haber especificado que el código de ejemplo no funciona y quería saber cómo hacerlo funcionar. – user1229895

Respuesta

5

El uso de argumentos con nombre y opcionales afecta a la resolución de sobrecarga de las siguientes maneras:

  • Un método, paso a paso, o el constructor es un candidato para la ejecución si cada uno de sus parámetros cualquiera es opcional o corresponde, por nombre o por posición, a un único argumento en la instrucción de llamada, y ese argumento se puede convertir al tipo del parámetro.

  • Si se encuentra más de un candidato, las reglas de resolución de sobrecarga para las conversiones preferidas se aplican a los argumentos que se especifican explícitamente. Los argumentos omitidos para los parámetros opcionales se ignoran.

  • Si dos candidatos se consideran igualmente buenos, la preferencia se dirige a un candidato que no tiene parámetros opcionales para los que se omitieron los argumentos en la llamada. Esto es una consecuencia de una preferencia general en la resolución de sobrecarga para los candidatos que tienen menos parámetros.

http://msdn.microsoft.com/en-us/library/dd264739.aspx

+0

Entiendo que compara las firmas, pero ¿podría reformular mi código de ejemplo para que funcione? – user1229895

+0

¿Cómo "no funciona"? ¿Llama la sobrecarga incorrecta? ¿Lanza una excepción? –

+0

siento entraron demasiado pronto ... por lo que para el primer caso, sin indicar explícitamente un argumento todos los opcionales se ignoran, lo que resulta en la firma menor que se llama ... y en el segundo caso de llamar a la sobrecarga con FooClass(), no es posible... entonces la respuesta es que no es posible usar named con argumentos opcionales omitidos? – user1229895

0

Parámetros opcionales se definen en el final de la lista de parámetros, después de los parámetros necesarios. Si la persona que llama proporciona un argumento para cualquiera de una sucesión de parámetros opcionales, debe proporcionar argumentos para todos los parámetros opcionales anteriores. Las lagunas separadas por comas en la lista de argumentos no son compatibles.

Además,

Un argumento con nombre puede seguir los argumentos posicionales, como se muestra aquí. CalculateBMI (123, altura: 64); Sin embargo, un argumento posicional no puede seguir un argumento con nombre. La siguiente declaración causa un error del compilador. // CalculateBMI (peso: 123, 64);

Cuestiones relacionadas