我有一个非常有趣的问题。
我有这样的抽象类:
abstract class BaseAbstract
{
… some abstract stuff.
}
我有一些派生类型。所以,他们看起来像这样:
class DerivedOneA
{
… abstract stuff implementation.
}
我有一些像这样的通用类型:
class GenericOne<T> where T: BaseAbstract, new()
{
GenericOne()
{
var type = new T();
… some code with type.
}
}
我有这样的问题:
class SomeClass
{
GenericOne<T> GetGenericOne<T>() where T : BaseAbstract, new()
{
var x = CreateGenericOne<DerivedOneA>(); // Okay.
//return new GenericOne<DerivedOneA>(); // Not okay. Cannot convert
// GenericOne<DerivedOneA> to GenericOne<T>.
// return x; // Not okay. The same as return before.
throw new Exception();
}
GenericOne<T> CreateGenericOne<T>() where T : BaseAbstract, new()
{
return new GenericOne<T>();
}
}
我需要这样的东西:
class SomeClass
{
GenericOne<T> GetGenericOne<T>() where T : BaseAbstract, new()
{
switch(desiredType)
{
case A:
return new GenericOne<DerivedOneA>();
case B:
return new GenericOne<DerivedOneB>();
…
default:
throw new ArgumentException();
}
}
我认为问题在于我不知道,我无法告诉编译器DerivedOne类是否符合约束条件,以防T在编译时知道它。
也欢迎其他解决方案。
答案 0 :(得分:1)
跟进Jon Skeets评论,当你致电GetGenericOne
时,你需要给它一个类型参数来完成T
var theGenericOne = GetGenericOne<DerivedOneA>();
这意味着在您的GetGenericOne<T>()
中应该看起来像
GenericOne<T> GetGenericOne<T>() where T : BaseAbstract, new()
{
var x = new CreateGenericOne<T>(); // Okay.
return x;
}
答案 1 :(得分:0)
在一个地方无法使用泛型类型参数和显式类型参数。