OptionalAttribute参数的默认值是?

lan*_*nce 16 c# default-value optional-parameters

MSDN的VS2010 命名和可选参数(C#编程指南)告诉我们C#中的可选参数,显示我期望的代码:

public void ExampleMethod(int required, 
    string optionalstr = "default string", 
    int optionalint = 10)
Run Code Online (Sandbox Code Playgroud)

好的,但它也说:

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

我阅读了MSDN的OptionalAttribute页面,并在线完成了搜索(显示很多人声称OptionalAttribute参数不能被C#使用 - 我猜这些评论是在C#4之前做出的?),但我找不到答案两个问题:

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

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

cas*_*One 12

规则如下:

  • 对于类型的参数object,Type.Missing传递.
  • 对于其他引用类型,null将传递.
  • 对于值类型,将传递值类型的默认值.

请注意,除了类型参数之外的所有内容object,它都相当于default(T).

我有点意外,因为C#4.0规范没有说明结果会是什么,我希望它会在那里.

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