#c# #.net #generics
#c# #.net #общие термины
Вопрос:
Я хочу иметь словарь, в котором значения являются универсальными объектами и не будут одинаковыми для каждого значения в словаре. Как это можно сделать, я чувствую, что мне не хватает чего-то простого.
НАПРИМЕР
public interface IMyMainInterface
{
Dictionary<string, IMyInterface<T>> Parameters { get; }
}
public interface IMyInterface<T>
{
T Value
{
get;
set;
}
void SomeFunction();
}
Result:
dic.Add("key1", new MyVal<string>());
dic.Add("key2", new MyVal<int>());
Ответ №1:
Вы не можете этого сделать, потому что T
не имеет смысла в IMyMainInterface
. Если ваша цель состоит в том, чтобы каждое значение было реализацией некоторого IMyInterface<T>
, но каждое значение могло быть реализацией для другого T
, то вам, вероятно, следует объявить базовый интерфейс:
public interface IMyInterface
{
void SomeFunction();
}
public interface IMyInterface<T> : IMyInterface
{
T Value { get; set; }
}
затем:
public interface IMyMainInterface
{
Dictionary<string, IMyInterface> Parameters { get; }
}
РЕДАКТИРОВАТЬ: Учитывая ваш обновленный вопрос, похоже, что это то, что вы пытаетесь сделать. Если вы хотите знать, почему вам приходится это делать, подумайте о том, как бы вы попытались использовать значения в словаре, если бы вы могли использовать свой исходный код. Представьте:
var pair = dictionary.First();
var value = pair.Value;
Какой тип можно value
определить как?
Однако, если каждое значение должно быть одинаковым T
, то вам просто нужно сделать ваш другой интерфейс тоже универсальным. Чтобы было понятнее, я переименовал параметр type, чтобы сохранить Ts отдельными:
public interface IMyMainInterface<TFoo>
{
Dictionary<string, IMyInterface<TFoo>> Parameters { get; }
}
Комментарии:
1. Если я выберу этот маршрут, чтобы извлечь значение из словаря, мне пришлось бы привести его к типу. т.е. MyDict[«ключ»].Значение. Значение (Да, неправильная терминология)
2. @Sytone: Да. В любом случае это абсолютно необходимо, потому что в противном случае вы могли бы попытаться извлечь значение для «key2» в виде строки вместо int… как компилятор мог узнать, что вы хотели?