【发布时间】:2013-05-01 14:11:29
【问题描述】:
假设我有两个班级,
class A
{
}
class B : A
{
}
我有一个方法接受foo 类型的参数IEnumerable<A>;
void AMethod(IEnumerable<A> foo)
{
}
而是传入IEnumerable<B>类型的值。
AMethod(new[] { new B() });
这会编译并执行,尽管在执行时 foo 已隐式转换为 IEnumerable<B>。现在假设我的 IEnumerable<B> 包含 A 类型的对象(我认为它们是混合的还是相同的并不重要)。当我打电话给foo.Any() 时,我得到了一个例外:
无法将“A”类型的对象转换为“B”类型
我知道我不能将基类转换为子类,但这不是我想要做的(事实上,在执行的这一点上,我什至不在乎它是什么类型)。我猜 LINQ 本质上是在尝试进行这种转换,可能是基于foo 是IEnumerable<B> 类型这一事实。因此,似乎我需要编写两种单独的方法,一种处理IEnumerable<A>,另一种处理IEnumerable<B>。我不明白为什么我需要这样做。有什么想法吗?
编辑:
正在进行一些动态转换和转换,设法吐出一个充满“A”的IEnumerable<B>,直到现在我认为这也是不可能的。我会尽力翻译导致此方法调用发生的情况:
protected void SetDynamicData(dynamic data)
{
_data = data;
IsB = typeof(IBInterface).IsAssignableFrom(_data.DataType);
}
...
var foo = IsB ? _data.Cast<B>() : data.Cast<A>();
return BuildJqGridData<A, B, int>(gridModel, foo);
【问题讨论】:
-
如果 B 继承了 A,则 B 是 A,但 A 不是 B。
-
IEnumerable<B>如何包含A类型的对象?能发个小代码sn-p来演示这个问题吗? -
我已经更新了你的问题,但没有改变其含义以使其更具可读性。
-
你的例子和你的问题不一样。在您的示例中,您传递了一个带有
B类型项目的IEnumerable<B>。这将工作 -
_data是什么类型?
标签: linq types casting ienumerable any