我正在读一本关于C#的书,我在命名和可选参数的章节中。我读过一个子弹,上面写着:
“如果存在多个可选参数且指定了值 一,所有前面的可选参数也必须提供值“
你能给我一个例子,因为我无法从代码中重现上述陈述。
答案 0 :(得分:10)
以此方法签名为例:
public void MyMethod(object arg1, string arg2 = null, int? arg3 = null, MyType arg4 = null)
{
// do stuff
}
您无法调用此方法,只能为arg1
和arg3
提供值,例如:
MyMethod(obj, 5);
你也必须在两者之间填写论据。原因是编译器不知道你的意思是第三个参数。所以它实际上会尝试将值放在第一个可选参数中,即string
。第三个参数不是字符串而是可空的int
,因此您会收到编译错误。
但是,从C#4开始,你也可以这样做:
MyMethod(obj, arg3: 5);
这些被称为命名参数。有关详细信息,请参阅此MSDN article。在这种情况下,编译器仍然可以确保类型安全,因为它知道您为哪个参数提供值。
编辑:正如其他人所指出的那样,方法声明中参数的顺序也很重要。所有可选参数必须在最后。然而,这不是问题的实际问题。问题表明'指定值',并在调用方法时执行此操作。
答案 1 :(得分:4)
它只是意味着可选参数必须全部位于参数列表中。
public void Method(int param1, int param2 = 0, int param3 = 0)
{
//This works
}
与
public void Method(int param1 = 0, int param2 = 0, int param3) //Param3 isn't optional.
{
//This does not!
}
public void Method(int param1 = 0, int param2, int param3 = 0) //Param2 isn't optional.
{
//Neither does this!
}
答案 2 :(得分:4)
这意味着您不能在2个或更多可选参数之间或之后具有正常参数
void MyMethod(int param1, int param2, int optparam3 = 5, int param4)
我显示的示例无效(遵循声明所示),可选参数必须始终是最后一个。
其次你的问题可能意味着如果一个方法存在多个可选参数,那么如果你决定提供1,你必须提供所有这些参数。从.net4.0开始,这个语句也是假的。我不能告诉旧的.net版本,因为我几乎从不使用可选项,但如果你有3个可选参数,你只能根据需要设置第二个。
他们的意思是,如果你只想要可选的#2,你必须填写可选的#1和可选的#3,这是不正确的。您可以在方法的调用中使用以下格式指定一个或多个可选项,并跳转您不想要的任何参数:
MyMethods(param1,param2,optional6 : 225, optional9 : "a string");