【发布时间】:2012-11-22 07:48:38
【问题描述】:
我有一段代码感觉是这样的:(我已经去掉了这些方法,因为它们对这个问题没有帮助)
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 的概念?
【问题讨论】:
-
如何调用更新?这里是什么?
-
什么是 T,调用 Update
() 方法的语句在哪里? -
是否有为 T 定义的约束?
-
你没有把整个代码。
A没有实现I所以你不能转换它。 -
无论如何,有一个通用的然后进行手动转换的想法..?为什么,运行时异常比编译错误好得多?
标签: c# generics interface casting theory