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>,这意味着您将获得一个等于nullNullable<T> 实例(HasValue property 将返回false

请注意,对于除object 类型的参数之外的所有内容,它等价于default(T)

我有点惊讶,因为C# 4.0 specification 没有说明结果会是什么,我希望它会在那里。

另外(如indicated by Scott Rippey in the comments),这是在编译时评估的,这不是运行时操作,这意味着如果您在已部署的其他程序集中调用此方法,并且您更改了可选值,传递给方法的默认值将不会更改,除非您编译所有对程序集中的方法进行调用的东西。

【讨论】:

您还应该提到这是在编译时评估的。编译器实际上是在编译时将默认值插入到调用代码中。 我认为值得一提的是,当通过反射调用方法时,您传入Type.Missing,并且适当的值将插入到被调用的方法中运行时间。所以它可以在运行时和编译时完成。 (参考:Type.Missing

以上是关于OptionalAttribute 参数的默认值?的主要内容,如果未能解决你的问题,请参考以下文章

函数之默认参数

Python 默认参数值

golang函数中的参数为啥不支持默认值

关于python带默认值的参数只能放在后面的问题

Python入门-5函数:06参数类型-位置参数-默认值参数-命名参数-可变参数-强制命名参数

golang函数中的参数为啥不支持默认值