Почему приведение списка .NET к интерфейсу IEnumerable‹Interface› не удается, если реализация представляет собой структуру?

Может ли кто-нибудь объяснить, почему приведение ниже не работает, когда реализация IMyInterface является структурой? Я не понимаю, почему среда выполнения заботится о разнице между классом и структурой здесь, учитывая, что список всегда является классом.

public interface IMyInterface
{
}

public class MyClass : IMyInterface
{
}

public struct MyStruct : IMyInterface
{
}

public static void TestCast<T>()
    where T : IMyInterface
{
    var works = (IEnumerable<IMyInterface>)new List<MyClass>();
    var invalidCastException = (IEnumerable<IMyInterface>)new List<MyStruct>();
}

person EM0    schedule 08.07.2016    source источник
comment
Я не могу ответить, почему, но вы можете использовать метод расширения .AsEnumerable() вместо приведения, чтобы получить желаемое поведение.   -  person Tomas Aschan    schedule 08.07.2016
comment
Отвечает ли это на ваш вопрос: stackoverflow.com/a/9688362/284240? MyStruct — тип значения, а MyClass — ссылочный тип; ковариация работает только тогда, когда оба типа являются ссылочными типами. Типы значений должны быть заключены в коробки. если вы переведете их на интерфейс. msdn.microsoft.com/en-us/library /25z57t8s(v=vs.90).aspx   -  person Tim Schmelter    schedule 08.07.2016
comment
@TomasLycken - это не работает. .AsEnumerable<IMyInterface> — это ошибка времени компиляции, а .AsEnumerable<MyStruct> по-прежнему не удается привести к IEnumerable<IMyInterface>.   -  person EM0    schedule 08.07.2016
comment
@TimSchmelter да, большое спасибо. Я просто не знал правильных ключевых слов для поиска, чтобы найти этот ответ.   -  person EM0    schedule 08.07.2016