2010-08-05 99 views
16

MSDN的VS2010 Named and Optional Arguments (C# Programming Guide)告诉我们在C#中的可选参数,显示像我期望代码:OptionalAttribute参数的默认值?

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

好,但它也说:

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

我读MSDN's OptionalAttribute page,并在线进行搜索(这说明很多人声称OptionalAttribute参数不能用C#消耗 - ?我猜这些评论之前,C#4发),但我可以”找不到答案的两个问题:

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

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

在调试中运行它并检查它的值。我会怀疑空。 – 2010-08-05 15:18:17

+0

那么,我会怀疑'default(T)'是null或零。 – 2010-08-05 15:21:46

回答

12

规则是这样的:

需要注意的是,除了object类型的参数一切的情况下,这相当于default(T)

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

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

+1

你还应该提到这是在编译时评估的。编译时,编译器实际上将默认值插入到**调用**代码中。 – 2012-02-01 04:04:41

+1

@ScottRippey完成。 – casperOne 2012-02-01 20:43:05

+1

我认为值得一提的是,当通过反射调用一个方法时,你传入'Type。Missing',并在* run *时间将被调用的方法中插入适当的值。所以它可以在运行时以及编译时完成。 (参考:['Type.Missing'](http://msdn.microsoft.com/en-us/library/system.type.missing.aspx)) – 2012-12-17 04:02:23