0

2つのクラスがあるとしましょう。

class A
{
}

class B : A
{
}

fooタイプのパラメーターを受け入れるメソッドがありますIEnumerable<A>;

void AMethod(IEnumerable<A> foo)
{
}

代わりに type の値を渡しますIEnumerable<B>

AMethod(new[] { new B() });

これはコンパイルおよび実行されますが、実行時fooに暗黙的に にキャストされIEnumerable<B>ます。ここで、 myIEnumerable<B>にタイプ A のオブジェクトが含まれているとします (それらが混在しているか、まったく同じであるかは問題ではないと思います)。電話foo.Any()すると例外が発生します。

タイプ「A」のオブジェクトをタイプ「B」にキャストできません

基本クラスをサブクラスに変換できないことは理解していますが、それは私がやろうとしていることではありません (実際、実行のこの時点では、それがどのような型であるかは気にしません)。fooおそらくtypeであるという事実に基づいて、LINQは本質的にこの変換を行おうとしていると思いIEnumerable<B>ます。IEnumerable<A>そのため、 を処理するメソッドとを処理するメソッドの 2 つの別個のメソッドを記述する必要があるよう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);
4

1 に答える 1