gpt4 book ai didi

c# - VS 2010 与 VS 2008 中 optionalAttribute(用于声明可选参数)行为的差异

转载 作者:太空狗 更新时间:2023-10-29 18:28:06 25 4
gpt4 key购买 nike

一个简单的 C# 方法,带有一个使用 OptionalAttribute as 声明的可选参数

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

在 VS 2010 上。obj.Foo(3,4) 按预期输出 7。但不是在 VS 2008 或之前,除非使用 DefaultParameterValue 属性提供了一些默认值。因此在 VS2008 或之前调用 Foo(3,4) 会导致错误:

“System.Reflection.Missing”类型的对象无法转换为“System.Double”类型

在 VS 2008 和 VS 2010 上,如果使用反射调用方法 Foo,那么如果没有为可选参数提供默认值,它会抛出相同的错误。

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);

那么问题是:

那么 VS 2010 编译器如何负责将默认值分配给可选参数,而框架 4.0 却不通过反射?

最佳答案

简单来说,是因为C# 3.5不支持可选参数。根据 MSDN ,

请注意,DefaultParameterValueAttribute 不会为不支持此功能的语言添加对默认参数的支持。例如,如果您将 DefaultParameterValueAttribute 与使用不支持默认参数的 C# 编写的方法一起使用,则在从 C# 调用该方法时不能使用默认参数。

关于c# - VS 2010 与 VS 2008 中 optionalAttribute(用于声明可选参数)行为的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5252389/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com