Как указать значения по умолчанию для параметров метода в кортежах c#7?

в C#, вы можете определить параметры по умолчанию, как описано здесь. Я играл с кортежами и C#7 (используя бета-помощью linqpad) следующим образом:

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. используйте nullable кортежи, укажите значения по умолчанию в теле метода.
  3. использовать значения кортежа по умолчанию
  4. использовать params массив чтобы разрешить более 2 кортежей в параметрах метода, укажите значения по умолчанию в теле метода

Примечание: опции 1., 2. и 4. позволяет задать любое желаемое значение по умолчанию, в то время как вариант 3. ограничивается значениями по умолчанию default ключевое слово.

2 ответов


a и b не являются константами. Все, что создает новый экземпляр (будь то структура или класс), не считается константой, а сигнатуры методов разрешают константы только в качестве значений по умолчанию.

тем не менее, нет способа по умолчанию кортежи из подписи метода, вы должны создать отдельный метод.

единственным выходом, похоже, является использование аргументов nullable:

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

вы можете указать значение по умолчанию, если вы довольны инициализацией по умолчанию 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)