为什么我不能将泛型类型强制转换为继承类型

本文关键字:转换 继承 类型 不能 泛型类型 为什么 | 更新日期: 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