16

MSDN 的 VS2010 Named and Optional Arguments (C# Programming Guide)向我们介绍了 C# 中的可选参数,显示了我期望的代码:

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

好的,但它也说:

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

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

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

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

1 回答 1

13

规则是这样的:

  • 对于类型的参数objectType.Missing被传递。
  • 对于其他引用类型,null通过。
  • 对于值类型,传递 值类型的默认值。

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

我有点惊讶,因为C# 4.0 规范没有说明结果是什么,我希望它会出现。

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

于 2010-08-05T15:28:03.343 回答