如何在C#中跳过可选参数?

58

示例:

public int foo(int x, int optionalY = 1, int optionalZ = 2) { ... }

我希望这样调用:

int returnVal = foo(5,,8); 
换句话说,我想提供xz,但我想对Y使用默认值,即optionalY = 1。然而,Visual Studio不喜欢,,,请帮忙。
4个回答

88
如果您使用的是C# 4.0,您可以使用命名参数功能:
foo(x: 5, optionalZ: 8); 

请查看此博客以获取更多信息。


4
记录一下,我认为更准确的称呼应该是命名参数。因为参数一直都有名字! - Jon Skeet
2
@marcog - https://dev59.com/D0XRa4cB1Zd3GeqPu9NF - Josiah Ruddell
@marcog:并不是每个人都这样做 :) 许多人之所以这样做,无疑是因为一些有影响力的作家早期这样做了。但这并不意味着跟随他们的步伐是正确的。特别是,规范使用术语“命名参数”-请参见第7.5.1节。 - Jon Skeet
2
不要混淆C# 4语言和C# 4编译器。只要使用C# 4编译器编译,即使针对.NET 3.5,仍然可以使用可选参数。 - Pierre-Alain Vigeant
顺便说一句,为了正确回答问题,optionalX 应该改成 optionalY - moinudin
显示剩余2条评论

20
在C# 4.0中,您可以像这样命名跳过默认参数后出现的参数:
int returnVal = foo(5, optionalZ: 8);

这被称为命名参数。许多其他语言都提供了此功能,它们通常使用 foo(5, optionalZ=8) 语法,当查看其他语言的代码时了解这种语法很有用。


3
如果原帖作者一开始就在使用可选参数,那么他一定是在使用C# 4 :) - Jon Skeet

0

另一种动态提供参数的方法是在类中实现您的方法,并向类构造函数提供命名参数。为什么不像这里提到的那样在同一行代码上添加对方法的调用呢:C#如何定义命名参数

var p = new PersonInfo { Name = "Peter", Age = 15 }.BuildPerson();


-1
这是一个晚回答,但对于那些遇到这个问题的人来说,可以使用Overloads,它使用与方法/函数相同的名称,但具有不同的参数集。
int SummAll (int a=0, int b=1, int c=2)
{return a+b+c;}

int SumAll (int a=0;int c=10) //skipping B 
{return a+c; }

这个模式等同于我们如何使用智能技术浏览函数的变化。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接