Универсальные типы с аргументами присваиваемого типа сами по себе не присваиваются.
Например, вы не можете разыграть List<string>
до List<object>
, хотя string
- это object
.
Не сразу понятно, почему такое преобразование не поддерживается, поэтому приведу пример:
var words = new List<string> { "Serve God", "love me", "mend" };
var objects = (List<object>) words; // C# compiler wouldn't allow this
objects.Add (new Car()); // we just added a Car to Shakespeare's work and the universe exploded
C # не способствует взрыву вселенной, однако, начиная с C # 4.0, реализована облегченная версия этой идеи. Видите ли, в некоторых случаях такое приведение было бы в действительности безопасным.
.NET 4.0 содержит понятия ковариации и контравариантности в обобщениях только для интерфейсов и делегатов , вы можете проверить это.
Пример (не работает до .NET 4.0):
void HandleCollection (IEnumerable<object> collection)
{
// ...
}
var words = new List<string> { "Serve God", "love me", "mend" };
// IEnumerable is defined as IEnumerable<out T> in .NET 4.0
// 'out' keyword guarantees that T is only used for return values
// and therefore client code can't explode the universe
var objects = (IEnumerable<object>) words;
HandleCollection (objects);