Какова настоящая причина для того ограничения? Это, просто работают, который должен был быть сделан? Это концептуально трудно? Действительно ли это невозможно?
Несомненно, нельзя было использовать параметры типа в полях, потому что они всегда - чтение-запись. Но это не может быть ответом, не так ли?
Причина этого вопроса состоит в том, что я пишу статью о поддержке различия в C# 4, и я чувствую, что должен объяснить, почему это ограничивается делегатами и интерфейсами. Только к инверсии бремя доказывания.
Обновление: Eric спрашивают о примере.
Что относительно этого (не знают, имеет ли это смысл, уже :-))
public class Lookup where T : Animal {
public T Find(string name) {
Animal a = _cache.FindAnimalByName(name);
return a as T;
}
}
var findReptiles = new Lookup();
Lookup findAnimals = findReptiles;
Причиной того, чтобы иметь это в одном классе мог быть кэш, который сохранен в самом классе. И не называйте своих домашних животных другого типа тем же!
BTW, это приносит мне к дополнительным параметрам типа в C# 5.0 :-)
Обновление 2: я не требую CLR, и C# должен позволить это. Просто пытаясь понять, что вело, к которому это не делает.
Во-первых, как говорит Томас, это не поддерживается в CLR.
Во-вторых, как это будет работать? Предположим, у вас есть
class C<out T>
{ ... how are you planning on using T in here? ... }
T может использоваться только в выходных позициях. Как вы заметили, в классе не может быть поля типа T, потому что это поле может быть записано. У класса не может быть никаких методов, которые принимают T, потому что они логически записываются. Предположим, у вас есть эта функция - как бы вы ею воспользовались?
Это было бы полезно для неизменяемых классов, если бы мы могли, скажем, сделать законным наличие поля типа T только для чтения; таким образом мы значительно сократим вероятность того, что это будет неправильно написано. Но довольно сложно придумать другие сценарии, допускающие вариацию безопасным для типов способом.
Если у вас есть такой сценарий, я бы хотел его увидеть. Это будет указывать на то, что когда-нибудь это будет реализовано в CLR.
ОБНОВЛЕНИЕ: См.
Почему нет универсальной дисперсии для классов в C # 4.0?
для получения дополнительной информации по этому вопросу.
Насколько мне известно, эта функция не поддерживается CLR, поэтому добавление этого потребует значительной работы и на стороне CLR. Я считаю, что ко- и контраверсия для интерфейсов и делегатов на самом деле поддерживалась в CLR до версии 4.0, так что это было относительно простое расширение для реализации.
(Хотя поддержка этой функции для классов была бы определенно полезной!)