Cha*_*bos 3 .net c# optional-parameters
我正在读一本关于C#的书,我在命名和可选参数的章节中.我读过一个子弹,上面写着:
"如果存在多个可选参数且为1指定了值,则还必须为所有前面的可选参数提供值"
能不能给我一个例子,因为我无法从代码中重现上述陈述.
pyr*_*lus 10
以此方法签名为例:
public void MyMethod(object arg1, string arg2 = null, int? arg3 = null, MyType arg4 = null)
{
// do stuff
}
Run Code Online (Sandbox Code Playgroud)
你不能调用这个方法,只提供arg1和的值arg3,如:
MyMethod(obj, 5);
Run Code Online (Sandbox Code Playgroud)
你也必须在两者之间填写论据.原因是编译器不知道你的意思是第三个参数.所以它实际上会尝试将值放在第一个可选参数中,即a string.第三个参数不是字符串而是可以为空int,因此会出现编译错误.
但是,从C#4开始,您还可以:
MyMethod(obj, arg3: 5);
Run Code Online (Sandbox Code Playgroud)
这些被称为命名参数.有关更多信息,请参阅此MSDN文章.在这种情况下,编译器仍然可以确保类型安全,因为它知道您为哪个参数提供值.
编辑:正如其他人所指出的,方法声明中参数的顺序也很重要.所有可选参数必须在最后.然而,这不是问题的实际问题.问题陈述"指定值",并在调用方法时执行此操作.
它只是意味着可选参数必须全部位于参数列表的最后。
public void Method(int param1, int param2 = 0, int param3 = 0)
{
//This works
}
Run Code Online (Sandbox Code Playgroud)
相对
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!
}
Run Code Online (Sandbox Code Playgroud)