我想实现一个通用方法,该方法应该创建一个双通用对象的实例。应该实例化的这个类的泛型类型是另一个类和第一个类型必须实现的接口。当我在具有泛型类型的泛型方法中调用 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>();
您正在接受任何I
可分配给IEntityBase
. 所以你也可以这样称呼它:
interface ITESTEntity2 : IEntityBase { }
class TESTEntity2 : ITESTEntity2 { }
GetQuery<ITESTEntity2>();
这个调用是有效的,但现在在你的方法中GetQuery()
:
new myQuery<TESTEntity, I>();
I
will ITESTEntity2
,TESTEntity
不可分配给。它不能被保证TESTEntity
是分配给任何I
其中I
可分配给IEntityBase
,如以上所证实ITESTEntity2
。
所以重新考虑你的设计。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句