Приведение Collection <T>к интерфейсу - почему это не работает? - PullRequest
1 голос
/ 12 декабря 2011

Может кто-нибудь объяснить, почему приведенный ниже код вызывает следующее исключение:

InvalidCastException: Unable to cast object of type 'System.Collections.ObjectModel.Collection'1[UserQuery+Test]' to type 'System.Collections.ObjectModel.Collection'1[UserQuery+ITest]'.

public interface ITest
{
}

public class Test : ITest
{
}

void Main()
{
  Collection<Test> t = new Collection<Test>();
  t.Add(new UserQuery.Test());
  var casted = (Collection<ITest>)t.Cast<ITest>();
}

Подпись для Cast<T> подразумевает вывод T, но это не такт.Что здесь происходит?covariance имеет какое-либо отношение к этому?

Ответы [ 2 ]

6 голосов
/ 12 декабря 2011

Когда вы используете Enumerable.Cast<T>, вы создаете новый IEnumerable<T>, а не просто "приведение" в традиционном смысле преобразования.

Таким образом, возвращаемая коллекция больше не является Collection<T>, а точнее внутренняя (не публичная) реализация IEnumerable<ITest>.

1 голос
/ 12 декабря 2011

Кастинг не нужен. Вы можете создать коллекцию, так что вам не нужно разыгрывать:

void Main()
{
  Collection<ITest> t = new Collection<ITest>();
  t.Add(new UserQuery.Test());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...