Можно ли привести тип параметра? - PullRequest
1 голос
/ 26 января 2012

В соответствии с неявной логикой преобразования, которая включает что-то вроде:

string str = "something";
Object o = str ;

Я ожидал, что присвоение Dictionary<string, string> для Dictionary<string, Object> будет возможно, но это не так.

Возможно ли явное приведение строкового значения к объекту без необходимости перебирать элементы keyValuePair?

РЕДАКТИРОВАТЬ1: заменены все слова бокса / распаковки на преобразование и приведение в качестве комментариев, а ответы не упоминают об этом Бокс выпуск.

Спасибо всем

Ответы [ 3 ]

3 голосов
/ 26 января 2012

Typecasting не поможет вам, но вы можете конвертировать один в другой с помощью LINQ:

Dictionary<string, object> newDict;
newDict = dict.ToDictionary(pair => pair.Key, pair => (object)pair.Value);
2 голосов
/ 26 января 2012

Речь идет не о боксе, а о ковариации и контравариантности.

Параметры общего типа не являются ковариантными. Так что вы не можете сделать это, по крайней мере, в C # 3.0. В C # 4.0 концепция реализована с помощью ключевых слов in и out, но общий словарь не изменился.

Подробнее о ковариации и контравариантности можно прочитать здесь и его следующих частях.

1 голос
/ 27 января 2012

Если бы существовали интерфейсы словаря только для чтения IReadableDictionary<TKey, out TValue> и IReadableDictionary<TValue> (использующие тип 'Object' в индексаторе), было бы возможно для кода, который должен был читать, но не писать, словарь, чтобы принять любой словарь со значениями типа, совместимого с требуемым типом (второй интерфейс будет использоваться, чтобы позволить коду, который хочет получить экземпляры basicThing, связанные с экземплярами Mammal, принять такие вещи, как Dictionary<Cat, basicThing> или Dictionary<Animal, DerivedThing> ). Нетрудно было бы извлечь класс из Dictionary<TKey, TValue> и добавить такие интерфейсы к этому классу, но я не знаю ни одного такого стандартного интерфейса. ILookup смутно похож, но совершенно другой.

...