Может ли кто-нибудь объяснить, почему приведение ниже не работает, когда реализация 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>();
}
.AsEnumerable()
вместо приведения, чтобы получить желаемое поведение. - person Tomas Aschan   schedule 08.07.2016MyStruct
— тип значения, аMyClass
— ссылочный тип; ковариация работает только тогда, когда оба типа являются ссылочными типами. Типы значений должны быть заключены в коробки. если вы переведете их на интерфейс. msdn.microsoft.com/en-us/library /25z57t8s(v=vs.90).aspx - person Tim Schmelter   schedule 08.07.2016.AsEnumerable<IMyInterface>
— это ошибка времени компиляции, а.AsEnumerable<MyStruct>
по-прежнему не удается привести кIEnumerable<IMyInterface>
. - person EM0   schedule 08.07.2016