我想实现一个泛型方法,该方法应该创建一个双泛型对象的实例。 应该实例化的此类的泛型类型是第一个类型必须实现的另一个类和一个接口。 当我在泛型方法中调用 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
将被ITESTEntity2
,TESTEntity
不能分配给它。不能保证TESTEntity
可分配给任何I
,其中I
可分配给IEntityBase
,如上ITESTEntity2
所示。
因此,请重新考虑您的设计。