泛型类中的多个约束给出了C#中的转换错误

时间:2013-03-29 07:38:42

标签: c# generics

我想解释一下这个问题的标题。

我有基类

 public class BaseClass { /* stuff */ }

继承BaseClass

的其他两个类
  public class Test1: BaseClass {  ... }

  public class Test2: BaseClass { ... }

好的,然后假设使用泛型类(在我的项目中它非常复杂)

  public GenericClass<T> : IBase<T> where T: BaseClass, Test1, Test2

有时我只需要使用BaseClass,否则Test1Test2

我有一个功能:

  public int Create ( T obj){
    if( obj is Test1) { return aManager.Create((Test1)obj); } // the cast is OK
    else if(obj is Test2) { return bManager.Create((Test2)obj);}  // error cast
  }

我还有aManager.Create (Test1 obj)bManager.Create(Test2 obj)

为什么在else行中我的演员有错误?

我的错误在哪里?

PS :如果我更改了Test1Test2之间的顺序,则会在第一个if中出现投射错误,并且else将会出现确定。

2 个答案:

答案 0 :(得分:0)

至于Test1Test2都是类,这一行不正确。

public GenericClass<T> : IBase<T> where T: BaseClass, Test1, Test2

因为泛型类型约束中只允许一个基类,并且它必须作为第一个约束,但是您可以将多个接口类型作为约束。 See this

要了解我的意思,请更改此类Create方法,您将看到错误:

public int Create ( T obj)
{
//if( obj is Test1) { return aManager.Create((Test1)obj); } // the cast is OK
//else if(obj is Test2) { return bManager.Create((Test2)obj);}  // error cast
    return 1;
}

答案 1 :(得分:0)

我认为您误解了泛型类型约束的工作原理。首先让我回答你的问题。

你实际上只需要这样的签名。

public GenericClass<T> : IBase<T> where T: BaseClass
  

这意味着,类型T是从类型BaseClass派生的任何类型   或BaseClass本身。

它将很好地接受BaseClass,Test1和Test2类型的任何实例。

此外,我想建议改进您的代码..

public int Create ( T obj){
    if( obj is Test1) { return aManager.Create(obj as Test1); } // the cast is OK
    else if(obj is Test2) { return bManager.Create(obj as Test2);}  // error cast
  }

但是,我认为代码的设计有一些循环漏洞。如果您可以更详细地解释您的上下文,您可能会为您的问题获得更好的设计解决方案。因为我认为这更多地与设计有关而不是泛型,因为看起来你正在使用错误的工具来完成工作。