如何检查泛型参数是否为Point3D及其派生类型?
解决方案
要检查泛型参数T是否是Point3D或其派生类型,你可以使用Type.IsAssignableFrom方法,代码如下:
private static void Execute<T>(IList<T> points, ...) where T : Point2D { if (typeof(Point3D).IsAssignableFrom(typeof(T))) { // 这里处理Point3D及其派生类型的逻辑 } }
为什么之前的写法报错?
你写的if (T is Point3D)是错误的,因为T是类型参数,而is运算符是用来判断某个对象实例是否属于指定类型(或其派生类型)的,不能直接用在类型本身上,所以会触发CS0119错误。
补充说明
typeof(Point3D).IsAssignableFrom(typeof(T))的含义是:T类型的实例可以赋值给Point3D类型的变量,这就涵盖了T是Point3D本身或者它的派生类的情况。- 如果你的方法里有
T类型的实例(比如points集合中的元素),也可以通过实例判断:
不过这种方式依赖集合非空,而直接用if (points.Count > 0 && points[0] is Point3D) { // 逻辑处理 }IsAssignableFrom针对泛型参数类型的检查更直接可靠。
内容的提问来源于stack exchange,提问作者abenci
相关产品推荐
相关产品推荐

