C# 分配IQueryable时出现编译错误<;int>;到IQueryable<;对象>;

C# 分配IQueryable时出现编译错误<;int>;到IQueryable<;对象>;,c#,covariance,C#,Covariance,为什么编译器不允许向对象分配int IQueryable<object> objects = null; IQueryable<int> ints = null; objects = ints; IQueryable对象=null; IQueryable ints=null; 对象=整数; 隐式类型转换(协方差函数)不适用于所有泛型。SomeGeneric不是从派生到SomeGeneric的,因此,即使已经存在类型参数的隐式转换(在本例中为装箱),强制转换它也是无效的

为什么编译器不允许向对象分配int

IQueryable<object> objects = null;
IQueryable<int> ints = null;
objects = ints;
IQueryable对象=null;
IQueryable ints=null;
对象=整数;
隐式类型转换(协方差函数)不适用于所有泛型。SomeGeneric不是从派生到SomeGeneric的,因此,即使已经存在类型参数的隐式转换(在本例中为装箱),强制转换它也是无效的


如果您使用的是C#4.0,则可以使用ISomeGeneric将泛型接口定义为协变接口,并且如果泛型参数彼此派生,则可以强制转换。如果未派生泛型参数,则无法强制转换。

您可以在分配之前将其强制转换为
IQueryable
(或)将其强制转换为
IQueryable
。项目的目标框架是什么?是否有可能是.NET framework 3.5或更旧版本?@elgonzo,我使用.NET framework 4.5.1这是重复的,但对于处理此问题的实际答案,因为您可以为对象指定一个int,
objects=ints.Cast()可以工作。好吧,IQuerable的类型参数是协变的(即,
IQueryable
)。。。嗯…也许OP的目标是.NET3.5或更高版本?检查我刚才的编辑。泛型协方差确实要求类型参数是彼此的导数。在OP的问题中,Int不是从Object继承的,因此不应该是可转换的。啊,你是对的……就实际的类型层次结构而言,Int32是从Object继承的(这就是为什么你可以将它们框起来),但值类型不能参与协方差(因为不能有boxed int的类型参数,至少在C++/CLI之外的任何语言中都不能)。