为什么我不能将泛型类型强制转换为继承类型
本文关键字:转换 继承 类型 不能 泛型类型 为什么 | 更新日期: 2023-09-27 18:32:56
我有一些具有以下定义的方法;
public void SomeMethod<T>() where T : BaseClass, new()
{
InheritedClass instance = (InheritedClass)instanceOfT; //won't compile
}
为什么不允许那个演员表?你怎么能解决这个问题?我有大约 200 行代码,它们都适用于泛型,除了我需要为每个继承类提供一个 LINQ 查询(有 3 个)。我试图进行typeof
检查,然后进行强制转换,然后执行适当的查询,但编译器不允许我进行强制转换......鉴于我刚刚检查以确保T
实际上是类型 InheritedClass
的实例,它不可能失败,为什么编译器不让我这样做?
您需要将变量强制转换为object
,然后返回以执行此操作。 因为它是编译器认为强制转换不可能成功,但它永远不会将该检查应用于 object
类型的变量。
InheritedClass instance = (InheritedClass)(object)instanceOfT;
因为实际实例OfT的类型(我们称之为InheritedClassB
)可能与InheritedClass
无关。
鉴于我刚刚检查以确保 T 实际上是 InheritedClass 类型的实例
实际上,你只是在检查 T 是否扩展了 BaseClass。
编辑:这看起来像代码气味。你不能让具体类处理这种方法吗?因此,每个具体类都有自己的实现,并且知道如何执行SomeMethod
。