繁体   English   中英

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

[英]Generic method type can't be used as generic type for generic class

我想实现一个通用方法,该方法应该创建一个双重通用对象的实例。 应该实例化的此类的通用类型是另一个类和第一个类型必须实现的接口。 当我在泛型方法中使用泛型类型调用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将是ITESTEntity2 ,不能将TESTEntity分配给它。 它不能被保证TESTEntity是分配给任何I其中I是分配给IEntityBase ,与上述证明ITESTEntity2

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM