簡體   English   中英

如何在 c#7 元組中指定方法參數的默認值?

[英]How can I specify default values for method parameters in c#7 tuples?

在 C# 中,您可以按照此處所述定義默認參數。 我正在使用元組和 C#7(使用LinqPadPreferences -> 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 個可能的選項:

  1. 老式方法:重載方法,在方法體中提供默認值。 缺點:如果你有 2 個以上的元組,重載變得很麻煩。
  2. 使用可空的元組,在方法體中提供默認值。
  3. 使用元組的默認值
  4. 使用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)

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

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM