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?