可选属性参数的默认值是什么?

16

MSDN的VS2010 命名和可选参数(C#编程指南)向我们介绍了C#中的可选参数,展示了我所期望的代码:

public void ExampleMethod(int required, 
    string optionalstr = "default string", 
    int optionalint = 10)

好的,但它还说:

您还可以使用.NET OptionalAttribute类声明可选参数。OptionalAttribute参数不需要默认值。

我阅读了MSDN的OptionalAttribute页面,并在网上搜索(显示许多人声称C#无法使用OptionalAttribute参数 - 我猜这些评论是在C# 4之前发表的?),但我找不到两个问题的答案:

如果我使用OptionalAttribute将C#参数定义为可选:

  1. 如果我调用该方法并未指定该参数的值,则将使用什么值?
  2. 该值将在编译时还是运行时评估?

在调试模式下运行它并检查其值。我会怀疑为空。 - Jimmy Hoffa
我会怀疑是 default(T),它是 null 或零。 - James Curran
1个回答

13
规则如下:

请注意,在除了类型为object的参数之外的情况下,它相当于default(T)

我有点惊讶,因为C# 4.0规范没有指出结果会是什么,我希望它在那里。

另外(正如Scott Rippey在评论中所说的那样),这是在编译时评估的,而不是运行时操作,这意味着如果您在其他已部署的程序集中调用此方法,并更改可选值,则传递给该方法的默认值将不会更改,除非您编译针对程序集中的该方法进行调用的所有内容。


1
你还应该提到这是在编译时评估的。编译器实际上会在编译时将默认值插入到调用代码中。 - Scott Rippey
1
我认为值得一提的是,当通过反射调用方法时,您可以传递 Type.Missing,并且在运行时将插入适当的值到被调用的方法中。因此,它既可以在运行时又可以在编译时完成。(参考:Type.Missing - Chris Morgan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接