【问题标题】:Compile error when assigning IQueryable<int> to IQueryable<object> [duplicate]将 IQueryable<int> 分配给 IQueryable<object> 时出现编译错误 [重复]
【发布时间】:2015-06-20 12:28:33
【问题描述】:

为什么编译器不允许将整数分配给对象?

IQueryable<object> objects = null;
IQueryable<int> ints = null;
objects = ints;

【问题讨论】:

  • 您可以在分配前将其转换为IQueryable&lt;ValueType&gt;(或)将其转换为IQueryable&lt;object&gt;。
  • 你项目的目标框架是什么?是不是 .NET 框架 3.5 或更早版本?
  • @elgonzo,我使用 .Net Framework 4.5.1
  • 这是重复的,但对于处理该问题的实际答案,因为您可以将 int 分配给对象,如果您确实需要这样的可查询对象,objects = ints.Cast&lt;object&gt;(); 会起作用。

标签: c# covariance


【解决方案1】:

隐式类型转换(协变函数)不适用于所有泛型。 SomeGeneric 不是从 SomeGeneric 派生的,因此,即使类型参数已经存在隐式转换,也无法对其进行强制转换(在这种情况下,拳击)。

如果您使用的是 C# 4.0,则可以使用 ISomeGeneric 将泛型接口定义为协变,并且前提是泛型参数是彼此派生的,然后你可以投。如果没有派生泛型参数,则无法进行强制转换。

【讨论】:

  • 嗯,根据其documentation...嗯...,IQuerable 的类型参数是协变的(即IQueryable&lt;out T&gt;)
  • 也许 OP 的目标是 .NET 3.5 或更早版本?
  • 检查我刚刚所做的编辑。通用协方差确实要求类型参数是彼此的衍生物。对于 OP 的问题,Int 不继承自 Object,因此不应该是可转换的。
  • 啊,你是对的......
  • Int32 确实继承自 Object,就实际类型层次结构而言(这就是您可以将它们装箱的原因),但值类型不能参与协方差(因为你不能有 boxed int 的类型参数,至少除了可能 C++/CLI)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-29
  • 2012-01-07
  • 1970-01-01
相关资源
最近更新 更多