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

时间:2013-09-25 16:21:55

标签: c# .net generics inheritance polymorphism

我有一些方法具有以下定义;

 public void SomeMethod<T>() where T : BaseClass, new()
 {
      InheritedClass instance = (InheritedClass)instanceOfT; //won't compile
 }

为什么不允许演员表?你怎么能绕过这个?我有大约200行代码,它们都适用于泛型,除了我需要为每个继承类提供一个LINQ查询(有3个)。我试图进行typeof检查,然后使用强制转换,然后执行相应的查询,但编译器不会让我进行转换......鉴于我刚检查以确保{{1}实际上是T类型的实例,它不会失败,为什么编译器不允许我这样做呢?

2 个答案:

答案 0 :(得分:2)

您需要将变量强制转换为object,然后返回以执行此操作。因为编译器认为演员阵容没有可能成功的方式,但它不会将该校验应用于object类型的变量。

InheritedClass instance = (InheritedClass)(object)instanceOfT;

答案 1 :(得分:1)

因为实际的instanceOfT类型(我们称之为InheritedClassB)可能与InheritedClass无关。

  

鉴于我刚检查以确保T实际上是InheritedClass类型的实例

实际上,你只是检查T是否扩展了BaseClass。

编辑:这看起来像代码味道..难道你不能让具体类处理这个方法吗?因此,每个具体类都有自己的实现,并知道如何执行SomeMethod