假设我有两节课,
class A
{
}
class B : A
{
}
我有一个接受foo
类型参数的方法IEnumerable<A>;
void AMethod(IEnumerable<A> foo)
{
}
而是传入一个 type 的值IEnumerable<B>
。
AMethod(new[] { new B() });
这会编译并执行,尽管在执行时foo
已隐式转换为IEnumerable<B>
. 现在假设我IEnumerable<B>
包含 A 类型的对象(我认为它们是混合的还是相同的并不重要)。当我打电话时,foo.Any()
我得到一个例外:
无法将“A”类型的对象转换为“B”类型
我知道我不能将基类转换为子类,但这不是我想要做的(事实上,在执行的这一点上,我什至不在乎它是什么类型)。我猜 LINQ 本质上是在尝试进行这种转换,可能是基于foo
type的事实IEnumerable<B>
。所以,似乎我需要编写两个单独的方法,一个是处理IEnumerable<A>
,一个是处理IEnumerable<B>
。我不明白为什么我需要这样做。有什么想法吗?
编辑:
正在进行一些动态的铸造和转换,设法吐出一个充满IEnumerable<B>
“A”的人,直到现在我认为这也是不可能的。我会尽力翻译导致此方法调用的情况:
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);