我有一段感觉像这样的代码:(我已经剥离了这些方法,因为它们对这个问题没有帮助)
public abstract class A { }
public interface I { }
public class C : A , I { }
public class Program
{
static void Update<T>(List<T> l,A a,I i,C c)
{
l.Add((T)a);//Error
l.Add((T)i);
l.Add((T)c);//Error
}
}
抽象类和具体类的转换在编译时失败,但接口没有。
我知道我可以做一些类似l.Add((T)(object)a);
欺骗编译器的事情,但我不明白为什么将接口转换为 T 有效。(如果它们都出错了,那么我可以假设它是某种类型检查错误)
我在java中尝试过,它们都可以工作。
public static <T> void update(List<T> l,C c,I i,A a){
l.add((T)c);//ok
l.add((T)i);//ok
l.add((T)a);//ok
}
仅仅是因为 c# 编译器的方式,还是我缺少一些关于 OOP 的概念?