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种可能的选择:
params
数组在方法的参数中允许超过2个元组,在方法体中提供默认值注意:选项1.,2.和4.允许指定任何所需的默认值,而选项3.仅限于default
关键字提供的默认值.
只要您对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)
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)
归档时间: |
|
查看次数: |
2209 次 |
最近记录: |