[英]How can I specify default values for method parameters in c#7 tuples?
在 C# 中,您可以按照此處所述定義默認參數。 我正在使用元組和 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 個可能的選項:
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);
}
不幸的是,您無法為元組的組件提供特定的默認值。
但是,對於您的特定示例(您希望默認為(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)
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);
}
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);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.