抽象类和new()用作约束;返回类型参数问题

时间:2016-12-28 20:44:57

标签: c# generics return-type type-constraints

我有一个非常有趣的问题。

我有这样的抽象类:

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在编译时知道它。

也欢迎其他解决方案。

2 个答案:

答案 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)

在一个地方无法使用泛型类型参数和显式类型参数。