OptionalAttribute 参数的默认值?
Posted
技术标签:
【中文标题】OptionalAttribute 参数的默认值?【英文标题】:OptionalAttribute parameter's default value? 【发布时间】:2011-03-25 21:05:09 【问题描述】:MSDN 的 VS2010 Named and Optional Arguments (C# Programming Guide) 告诉我们 C# 中的可选参数,显示的代码如我所料:
public void ExampleMethod(int required,
string optionalstr = "default string",
int optionalint = 10)
好的,但它也说:
您也可以声明可选 使用 .NET 参数 可选属性类。 OptionalAttribute 参数不 需要一个默认值。
我阅读了MSDN's OptionalAttribute page,并在网上进行了搜索(这表明很多人声称 OptionalAttribute 参数不能被 C# 使用——我猜这些 cmets 是在 C# 4 之前制作的?),但我不能找到两个问题的答案:
如果我使用 OptionalAttribute 将 C# 参数定义为可选:
-
如果我调用该方法但未指定该参数的值,将使用什么值?
会在编译时或运行时评估该值吗?
【问题讨论】:
在调试中运行它并检查它的值。我会怀疑 null。 好吧,我怀疑default(T)
是 null 或零。
【参考方案1】:
规则是这样的:
对于object
类型的参数,传递Type.Missing
。
对于其他引用类型,null
被传递。
对于值类型,default of the value type 被传递。
对于Nullable<T>
,这意味着您将获得一个等于null
的Nullable<T>
实例(HasValue
property 将返回false
)
请注意,对于除object
类型的参数之外的所有内容,它等价于default(T)
。
我有点惊讶,因为C# 4.0 specification 没有说明结果会是什么,我希望它会在那里。
另外(如indicated by Scott Rippey in the comments),这是在编译时评估的,这不是运行时操作,这意味着如果您在已部署的其他程序集中调用此方法,并且您更改了可选值,传递给方法的默认值将不会更改,除非您编译所有对程序集中的方法进行调用的东西。
【讨论】:
您还应该提到这是在编译时评估的。编译器实际上是在编译时将默认值插入到调用代码中。 我认为也值得一提的是,当通过反射调用方法时,您传入Type.Missing
,并且适当的值将插入到被调用的方法中运行时间。所以它可以在运行时和编译时完成。 (参考:Type.Missing
)以上是关于OptionalAttribute 参数的默认值?的主要内容,如果未能解决你的问题,请参考以下文章