Ответ 1
Нет, вы не можете. Типы ValueTuple
фактически не зависят от поддержки названного поля в С#. Последнее работает больше как именованные свойства для анонимных типов. То есть компилятор анализирует код и генерирует псевдонимы соответствующим членам в соответствии с вашими декларациями и обычаями. Через задание компилятор узнает имена полей. Поскольку синтаксис базового конструктора не предоставляет механизм для названия полей, вы не можете использовать его для прямого генерации кортежа с именованными полями.
Конечно, есть способы перепроверить значение, возвращаемое из синтаксиса конструктора, чтобы присвоить имена этому возвращенному значению. Я предполагаю, что вы знаете об этом подходе и ищете что-то более прямое.
В качестве примера того, что я имею в виду под "повторной интерпретацией", вы можете сделать что-то вроде этого:
static (int value, string text) ConvertToNamed((int value, string text) t)
{
return t;
}
то это будет имя полей в новой переменной:
var t1 = new ValueTuple<int, string>(21, "hello");
var t2 = ConvertToNamed(t1);
Переменная t1
застревает с Item1
и Item2
. Но компилятор будет неявно генерировать желаемые имена для переменной t2
.
Возможно, лучшим примером является тот, где не требуется дополнительный метод:
(int value, string text) t = new ValueTuple<int, string>(21, "hello");
Опять же, вы на самом деле не называете поля в синтаксисе конструктора, но они интерпретируются локальным объявлением переменной.
Это, вероятно, не является серьезным ограничением. В сценарии, где есть желание иметь постоянное, легко назначенное имя, вероятно, лучше объявить пользовательский тип, чем использовать синтаксис кортежа в любом случае. Вы также можете написать деконструкторы для пользовательских типов, и объявление таких типов означает, что имена являются первоклассными гражданами, когда дело доходит до размышления, dynamic
и т.д.