Кастинг значение словаря кортежу не удается - PullRequest
0 голосов
/ 22 апреля 2020

У меня есть словарь с ключом известного типа (в данном примере: строка) и кортеж в качестве значения. Я хочу передать этот словарь в приложении и обычно могу легко распаковать данные, используя ключ словаря (в реальном приложении это не строка).

Но у меня есть один вариант использования, в котором Меня интересует только первый элемент кортежа, я знаю только, сколько других элементов в кортеже, но я не знаю их тип при получении словаря.

// Some place of the application defines the dictionary like this and adds some values...
var dictionary = new Dictionary<string, dynamic>();
dictionary.Add("key", ("I'm interested in this tuple element only", new List<int>().ToImmutableList()));


// In some other place of the application, I get the dictionary from above, but I'm interested only 
// in the first element of the tuple, from the other elements I don't know the type so I try
// to access it like:
(string valueOfInterest, object) element = dictionary["key"];    

// Do something with valueOfInterest

Но это код дает мне

Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 
Cannot implicitly convert type System.ValueTuple<string,System.Collections.Immutable.ImmutableList<int>>' 
to 'System.ValueTuple<string,object>'

Так что мне интересно, как это возможно (или вообще возможно), получить доступ только к первому элементу кортежа и «отбросить» остальные, преобразовав их на объект.

1 Ответ

1 голос
/ 22 апреля 2020

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

var element = dictionary["key"];
var value = element.Item1;

Это будет работать до тех пор, пока значение в словаре не станет равным Tuple.

Согласно Разрешение метода Deconstruct specs

Это означает, что rhs не может быть динамическим c и что ни один из параметров метод Deconstruct может быть аргументом типа.

...