Я знаю, что могу назвать параметры, когда я создаю кортеж неявно:
var me = (age: 21, favoriteFood: "Custard");
Можно ли указать параметры, когда кортеж создается явно? то есть.
var me = new ValueTuple<int, string>(21, "Custard");
Я знаю, что могу назвать параметры, когда я создаю кортеж неявно:
var me = (age: 21, favoriteFood: "Custard");
Можно ли указать параметры, когда кортеж создается явно? то есть.
var me = new ValueTuple<int, string>(21, "Custard");
Нет, вы не можете. Типы 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
и т.д.
Я так не верю. Вот документы, которые я нашел в 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;