为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
HUWWW 2023-08-13 10:10:56
我想实现一个通用方法,该方法应该创建双通用对象的实例。应实例化的此类的泛型类型是第一个类型必须实现的另一个类和接口。CS0311当我在泛型方法中使用其泛型类型调用 new 时,即使我将类型正确限制为基本接口,也会出现编译器错误。为什么我不能创建这样的实例?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{}
查看完整描述

1 回答

?
撒科打诨

TA贡献1934条经验 获得超2个赞

假设您有这些定义:


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将是ITESTEntity2,TESTEntity不可分配给它。不能保证 可以TESTEntity分配给任何可分配给 的I位置,如上面使用 演示的那样。IIEntityBaseITESTEntity2


所以重新考虑你的设计。


查看完整回答
反对 回复 2023-08-13
  • 1 回答
  • 0 关注
  • 116 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信