У меня проблемы с общим методом, который я пишу. Он имеет следующую подпись;Проблема с литьем в стандартном методе C#
public static ThingCollection<T> GetThings<T>(...) where T : Thing
Существует несколько классов; ThingA, ThingB и ThingC, которые наследуются от Thing; и я хочу иметь код, подобный этому в методе.
var things = new ThingCollection<T>();
if (typeof(T) == typeof(Thing))
foreach (var item in someCollection)
things.Add((T)new Thing(...));
else if (typeof(T) == typeof(ThingA))
foreach (var item in someCollection)
things.Add((T)new ThingA(...));
else if (typeof(T) == typeof(ThingB))
foreach (var item in someCollection)
things.Add((T)new ThingB(...));
else if (typeof(T) == typeof(ThingC))
foreach (var item in someCollection)
things.Add((T)new ThingC(...));
else
throw new Exception("Cannot return things of type " + typeof(T).ToString());
return things;
Проблема заключается в том, что я получаю лучший перегружен матч метода имеет недопустимые аргументы ошибку, если я не отбрасываю новые объекты. Добавление T-тэгов, как показано выше, отлично подходит для нового Thing(), но сообщает Невозможно преобразовать тип «ThingA» в «T» для других новых вызовов. Intellisense указывает, что T является Вещью, но я не понимаю, почему я не могу отбрасывать другие объекты в Thing, поскольку они наследуют от него.
Возможно, это неправильный способ делать то, что я пытаюсь сделать. Я на правильном пути? Возможно, отсутствует какой-то небольшой нюанс, или я должен делать что-то еще?
Это была большая помощь. Я боролся за то, чтобы справиться с дженериками, поскольку я не понимал, что мне не нужно создавать ThingCollection только потому, что он наследуется от общего списка. – 2008-11-13 14:56:50