2011-03-09 10 views
8

Un simple método de C# con un parámetro opcional declara usando el OptionalAttribute comodiferencia en el comportamiento de OptionalAttribute (utiliza para declarar un parámetro opcional) en VS 2010 vs VS 2008

namespace ClassLibrary11 
{ 
    public class Class1 
    { 
     public int Foo(int a, int b, [Optional] int c) 
     { 
     return a + b + c; 
     } 
    } 
} 

En VS 2010. obj.Foo(3,4) salidas 7 como se esperaba. Pero no en VS 2008 o antes a menos que se proporcione algún valor predeterminado utilizando DefaultParameterValue Attribute. Por lo que una llamada a Foo(3,4) en VS2008 o antes los resultados en un error:

Object of type 'System.Reflection.Missing' cannot be converted to type 'System.Double'

Por tanto VS 2008 y VS 2010, si la reflexión se utiliza para invocar el método Foo, entonces se lanza el mismo error si el valor por defecto no se proporciona para el parámetro opcional.

ClassLibrary11.Class1 cls = new ClassLibrary11.Class1(); 
MethodInfo mi = typeof(ClassLibrary11.Class1).GetMethod("Foo"); 
Object[] objarr = new Object[] {1,2, Missing.Value}; 
Object res = mi.Invoke(cls, objarr); 

Así que la pregunta es:

Entonces, ¿cómo es que VS 2010 compilador se encarga de asignar el valor por defecto para el parámetro opcional pero el marco 4.0 no lo hace a través de la reflexión?

Respuesta

3

parámetros opcionales se han introducido con .NET 4.0 en C#, no estoy seguro de lo que usted está construyendo con VS 2008 apuntan a un marco más viejo, pero yo diría que debe usarlos sólo en VS 2010 y .NET 4.0 Named and Optional Arguments

7

En pocas palabras, es porque C# 3.5 no admite parámetros opcionales. Según MSDN,

Tenga en cuenta que DefaultParameterValueAttribute no agrega soporte para los parámetros predeterminados a los idiomas que no admiten esta característica. Por ejemplo, si usa DefaultParameterValueAttribute con un método escrito en C#, que no admite parámetros predeterminados, no puede usar el parámetro predeterminado al invocar el método desde C#.