如何在c#7元组中指定方法参数的默认值?

Mat*_*att 9 .net c# parameters default c#-7.0

在C#中,您可以按此处所述定义默认参数.我正在使用元组和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);
}
Run Code Online (Sandbox Code Playgroud)

这很好,它显示了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);
}
Run Code Online (Sandbox Code Playgroud)

但我收到错误消息:

CS1736"a"的默认参数值必须是编译时常量

CS1736"b"的缺省参数值必须是编译时常量

我究竟做错了什么?


更新

谢谢你提供了很好的答案,我学到了很多东西.让我总结一下:要获得元组参数的默认值,有3种可能的选择:

  1. 老式的方法:重载方法,在方法体中提供默认值.缺点:如果你有超过2个元组,重载会变得很麻烦.
  2. 使用可空元组,在方法体中提供默认值.
  3. 使用元组的默认值
  4. 使用params数组在方法的参数中允许超过2个元组,在方法体中提供默认值

注意:选项1.,2.和4.允许指定任何所需的默认值,而选项3.仅限于default关键字提供的默认值.

Mat*_*son 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);
}
Run Code Online (Sandbox Code Playgroud)

遗憾的是,您无法为元组的组件提供特定的默认值.

但是,对于您的特定示例(您要默认的位置(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));
}
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做:

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)
Run Code Online (Sandbox Code Playgroud)


Pat*_*man 5

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);
}
Run Code Online (Sandbox Code Playgroud)