【发布时间】:2017-06-13 00:51:22
【问题描述】:
在 C# 中,您可以定义默认参数,如 here 所述。我正在玩元组和 C#7(使用 LinqPad 并打开 Preferences -> Queries -> Use Roslyn assemblies)如下:
void Main()
{
var result=AddTuples((1, 2), (3, 4));
Console.WriteLine($"Result is: {result}");
}
(int x, int y) AddTuples((int x, int y) a, (int x, int y) b)
{
return (a.x + b.x, a.y + b.y);
}
这很好用,它显示了 a 和 b 的总和:
结果是:(4, 6)
现在我试图将AddTuples 修改为具有默认参数,但不知何故我无法弄清楚如何。我尝试的是这样的:
(int x, int y) AddTuples2((int x, int y) a = (0, 0), (int x, int y) b = (0, 0))
{
return (a.x + b.x, a.y + b.y);
}
但我收到错误消息:
CS1736 'a' 的默认参数值必须是编译时常量
CS1736 'b' 的默认参数值必须是编译时常量
(在线试用DotNetFiddle)
我做错了什么?
更新
感谢您提供的出色答案,我学到了很多东西。让我总结一下:要为元组参数设置默认值,有 3 个可能的选项:
- 老式方法:重载方法,在方法体中提供默认值。缺点:如果你有超过 2 个元组,重载就会变得很麻烦。
- Use nullable tuples,在方法体中提供默认值。
- Use tuple's default values
-
Use a
paramsarray 允许方法参数中的元组超过 2 个,在方法体中提供默认值
注意:选项 1.、2. 和 4. 允许指定任何所需的默认值,而选项 3. 仅限于 default 关键字提供的默认值。
【问题讨论】:
-
我想您将无法做到这一点,因为结构实例不能是常量,而元组实际上只是结构。
-
创建另一个不带参数的方法,并从内部使用零元组调用您的方法
-
@Jan - 是的,我知道这总是可能的。我认为 C#7 的设计者实现了更多的语法糖......
-
元组实际上只是一种编译器接受特殊初始化语法的结构,例如(int x, int y) a = (0,0),并且结构通常不是编译时常量,因为没有什么禁止结构具有产生任意副作用的构造函数,这反过来又与编译时常量相矛盾约束。要实现所需的行为,您需要对该方法进行多次重载。
-
@Matt 确实更优雅,但它是以拳击为代价的,如下所述:msdn.microsoft.com/en-us/library/ms228597.aspx。我想这只是偏好问题。在这种特殊情况下,我个人更喜欢性能而不是优雅。
标签: c# .net parameters default c#-7.0