Имя ValueTuple свойства при создании с помощью новых

Я знаю, что могу назвать параметры, когда я создаю кортеж неявно:

var me = (age: 21, favoriteFood: "Custard");

Можно ли указать параметры, когда кортеж создается явно? то есть.

var me = new ValueTuple<int, string>(21, "Custard");

Ответ 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 и т.д.

Ответ 2

Я так не верю. Вот документы, которые я нашел в ValueTuple:

https://docs.microsoft.com/en-us/dotnet/api/system.valuetuple-7?view=netframework-4.7

Я лично не использовал тип ValueTuble. Я использовал класс Tuple раньше:

var tuple = new Tuple<int, string>(21, "Custard");
var number = tuple.Item1;
var st = tuple.Item2;

Тем не менее, я нахожу использование Tuples, особенно когда переданы методы, которые будут неуклюжими. Всегда нужно знать, что есть в Item1 и Item2 и т.д. В соответствии с документами ValueTuple он используется таким же образом.

Разве вы не просто создаете класс сущности?

Я использовал Анонимный тип, который, я думаю, подойдет вашим потребностям.

var anyom = new
{
    age = 21,
    favoriteFood = "Custard"
};

number = anyom.age;
st = anyom.favoriteFood;