У меня небольшие затруднения с пониманием, в чем здесь проблема. У меня есть немного кода, который извлекает записи из базы данных с помощью LINQ и помещает их в объект, который преобразуется в интерфейс. Это выглядит примерно так:
public IEnumerable<ISomeObject> query()
{
return from a in dc.SomeTable
select new SomeObject
{
//Assign various members here
} as ISomeObject;
}
Когда я проверяю это, я помещаю возвращенный IEnumerable в переменную с именем results и запускаю следующую строку:
Assert.AreEqual(EXPECTED_COUNT, results.Count());
При запуске я получаю исключение System.Security.VerificationException: «Операция может дестабилизировать среду выполнения.»
Я нашел решение здесь , а именно:
var results = from a in dc.SomeTable
select new SomeObject
{
//Assign various members here
} as ISomeTable;
return results.OfType<ISomeObject>();
Это работает, но мне трудно понять, что здесь происходит. Почему я вообще получил исключение и как строки кода выше исправили это? Документация MSDN, по-видимому, предполагает, что это проблема безопасности типов, но я не вижу, где предыдущий код был небезопасным.
UPDATE
Чуть больше информации я узнал. Первый пример работает, если я сделаю возвращаемый тип IQueryable. Это проливает немного больше света на , что пошло не так, но я все еще не понимаю, почему почему . Почему компилятор не заставил меня преобразовать IEnumerable в IQueryable?