我想解释一下这个问题的标题。
我有基类
public class BaseClass { /* stuff */ }
继承BaseClass
public class Test1: BaseClass { ... }
public class Test2: BaseClass { ... }
好的,然后假设使用泛型类(在我的项目中它非常复杂)
public GenericClass<T> : IBase<T> where T: BaseClass, Test1, Test2
有时我只需要使用BaseClass
,否则Test1
或Test2
。
我有一个功能:
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 :如果我更改了Test1
和Test2
之间的顺序,则会在第一个if
中出现投射错误,并且else
将会出现确定。
答案 0 :(得分:0)
至于Test1
和Test2
都是类,这一行不正确。
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
}
但是,我认为代码的设计有一些循环漏洞。如果您可以更详细地解释您的上下文,您可能会为您的问题获得更好的设计解决方案。因为我认为这更多地与设计有关而不是泛型,因为看起来你正在使用错误的工具来完成工作。