在C#中,您可以按照here所述定义默认参数。我正在使用元组和C#7(使用LinqPad beta),如下所示:
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'的默认参数值必须是编译时常量
我做错了什么?
感谢您提供了很好的答案,我已经学到了很多东西。让我总结一下:要获得元组参数的默认值,有3种可能的选项:
params
array在方法参数中允许超过2个元组,在方法体中提供默认值 注意:选项1.,2。和4.允许指定任何所需的默认值,而选项3.仅限于default
关键字提供的默认值。< / p>
答案 0 :(得分:6)
只要您对int
组件的默认初始化为零感到满意,就可以指定默认值:
public static (int x, int y) AddTuples(
(int x, int y) a = default((int, int)),
(int x, int y) b = default((int, int)))
{
return (a.x + b.x, a.y + b.y);
}
很遗憾,您无法为元组的组件提供特定的默认值。
但是,对于您的具体示例(您希望默认为(0, 0)
),这似乎已足够。
[附录]
此特定示例的另一种方法是使用params
数组:
public static (int x, int y) AddTuples(params (int x, int y)[] tuples)
{
return (tuples.Sum(t => t.x), tuples.Sum(t => t.y));
}
然后你可以这样做:
Console.WriteLine($"Result is: {AddTuples()}"); // (0, 0)
Console.WriteLine($"Result is: {AddTuples((1, 1))}"); // (1, 1)
Console.WriteLine($"Result is: {AddTuples((1, 1), (2, 2))}"); // (3, 3)
Console.WriteLine($"Result is: {AddTuples((1, 1), (2, 2), (3, 3))}"); // (6, 6)
答案 1 :(得分:4)
a
和b
不是常量。创建新实例(无论是结构还是类)的所有内容都不被视为常量,方法签名仅允许常量作为默认值。
也就是说,没有办法从方法签名中默认元组,你必须创建一个单独的方法。
唯一的出路似乎是使用可以为空的参数:
(int x, int y) AddTuples2((int x, int y)? a = null, (int x, int y)? b = null)
{
(int x, int y) aNN = a ?? (0,0);
(int x, int y) bNN = b ?? (0,0);
return (aNN.x + bNN.x, aNN.y + bNN.y);
}
答案 2 :(得分:1)
VisualStudio 2017建议对Patricks答案进行以下简化:
(int x, int y) AddTuples2((int x, int y)? a = null, (int u, int v)? b = null)
{
(int x, int y) = a ?? (0,0);
(int u, int v) = b ?? (0,0);
return (x + u, y + v);
}