可选参数在C#中并不是什么新鲜事,自从C#5.0发布以来我就知道了这一点,但我刚刚遇到了一些问题。当我为我的MVC模型使用数据注释时,例如Required
属性,我看到了:
所以我能做到:
[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属性中创建这样的命名参数)。
答案 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
,因为它作为第一个参数进入。
简而言之,在调用函数时应始终避免使用此语法,因为它不会执行您期望的操作。