Как указать значения по умолчанию для параметров метода в кортежах 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 возможных опции:
- старомодный способ: перегрузка метода, предоставляет значения по умолчанию в теле метода. Недостаток: если у вас более 2 кортежей, перегрузка становится громоздкой.
- используйте nullable кортежи, укажите значения по умолчанию в теле метода.
- использовать значения кортежа по умолчанию
-
использовать
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)