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

时间:2017-01-27 10:55:02

标签: c# .net parameters default c#-7.0

在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种可能的选项:

  1. 过时的方法:重载方法,在方法体中提供默认值。缺点:如果你有超过2个元组,重载会变得很麻烦。
  2. Use nullable tuples,在方法正文中提供默认值。
  3. Use tuple's default values
  4. Use a params array在方法参数中允许超过2个元组,在方法体中提供默认值
  5. 注意:选项1.,2。和4.允许指定任何所需的默认值,而选项3.仅限于default关键字提供的默认值。< / p>

3 个答案:

答案 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)

ab不是常量。创建新实例(无论是结构还是类)的所有内容都不被视为常量,方法签名仅允许常量作为默认值。

也就是说,没有办法从方法签名中默认元组,你必须创建一个单独的方法。

唯一的出路似乎是使用可以为空的参数:

(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);
}