命名参数与可选参数

时间:2015-03-04 23:18:58

标签: c#

可选参数在C#中并不是什么新鲜事,自从C#5.0发布以来我就知道了这一点,但我刚刚遇到了一些问题。当我为我的MVC模型使用数据注释时,例如Required属性,我看到了:

enter image description here

所以我能做到:

[Required(ErrorMessage="Something"]

但是,当我使用可选参数创建自己的方法时,如:

void Test(String x = null, String y = null) {}

我可以通过以下两种方式传递参数:

Test(x = "Test") OR Test(x: "Test")

Required属性中,我总是必须使用=,如果我使用:,则会导致错误。 例如:

 Required(ErrorMessage:"Something") --> Compile time error

所以我看到的是那些命名参数的创建方式与我已经知道的不同。我的问题是如何为方法创建它们(如何在Required属性中创建这样的命名参数)。

3 个答案:

答案 0 :(得分:4)

属性有自己的语法。它使用name=value形式作为命名参数。

对于普通方法,您无法使用该表单,您将无法使用name:value表单。

无法将name=value表单用于常规方法。编译器无法判断您是否尝试使用命名参数,或者您是否尝试为变量赋值并将赋值用作参数值。

答案 1 :(得分:2)

尽管这种语法看起来像方法调用:

[Required(ErrorMessage="Something")]

属性是,而不是方法。您没有在上面的行中指定参数,而是在初始化属性。请参阅Attribute base class documentation上的示例,了解我的意思。

因此,属性指定语法类似于C#的类初始化语法:

new RequiredAttribute { ErrorMessage = "Something" };

目前在C#中没有用于为方法指定命名参数的等效语法。

答案 2 :(得分:0)

如果您执行以下操作:

string y; 
Test(y = "Test")

您可以使用该语法调用函数。但要小心...... y = "Test"实际上是设置变量y,然后将其传递给函数!那里有副作用,这可能是不可取的。此外,"Test"已传递到x函数的参数Test,而不是y,因为它作为第一个参数进入。

简而言之,在调用函数时应始终避免使用此语法,因为它不会执行您期望的操作。