泛型方法类型不能用作泛型类的泛型类型



我想实现一个泛型方法,该方法应该创建一个双泛型对象的实例。 应该实例化的此类的泛型类型是第一个类型必须实现的另一个类和一个接口。 当我在泛型方法中调用 new 及其泛型类型时,即使我将类型正确限制为基接口,我也会收到编译器错误CS0311。 为什么我不能创建这样的实例?

class Program
{
static void Main(string[] args)
{
GetQuery<ITESTEntity>();
}
static void GetQuery<I>() where I : IEntityBase
{
var qry = new myQuery<TESTEntity, I>();
}
}
class myQuery<T, I> 
where T : class, I
where I : IEntityBase
{
}

假设你有这些定义:

interface IEntityBase { }
interface ITESTEntity : IEntityBase { }
class TESTEntity : ITESTEntity { }

那么你的问题源于这里:

class myQuery<T, I> 
where T : class, I
where I : IEntityBase

您是说T必须可分配给I,并且I必须可分配给IEntityBase。这很好,但在这里:

static void GetQuery<I>() where I : IEntityBase
{
var qry = new myQuery<TESTEntity, I>();

您接受可分配给IEntityBase的任何I。所以你也可以这样称呼它:

interface ITESTEntity2 : IEntityBase { }
class TESTEntity2 : ITESTEntity2 { }
GetQuery<ITESTEntity2>();

此调用将是有效的,但现在在您的方法中GetQuery()

new myQuery<TESTEntity, I>();

I将被ITESTEntity2TESTEntity不能分配给它。不能保证TESTEntity可分配给任何I,其中I可分配给IEntityBase,如上ITESTEntity2所示。

因此,请重新考虑您的设计。

最新更新