1

次のように、アイテムが通常のリストに存在するかどうかを確認できます。

Dim x as new list(of string)
dim result = x.any(function (y) y.length > 4)

4文字を超える項目があるかどうかに応じて、trueまたはfalseを返します。

ただし、これを行うと:

dim e as object = new expandoobject
dim x as new list(of string)
e.items = x

dim result = e.items.any(function (y) y.length > 4)

いずれもリストの拡張メソッドではないというエラーメッセージを生成します。

なぜこれが発生するのか、リストをexpandoobjectに割り当ててから、拡張メソッドを使用できるかどうかを誰かに教えてもらえますか?

ありがとう

4

2 に答える 2

0

拡張メソッドは単なるシンタックス シュガーだからです。実際に言うと、

薄暗い結果 = items.any(Function(y) y.length > 4)

System.Linq.Enumerable次のように、クラスの静的メソッドを実際に呼び出しています。

暗い結果 = Enumerable.Any(e.items, Function(y) y.length > 4)

これは、コンパイラによって自動的に変換されます。length残念ながら、動的オブジェクトを使用しているため、プロパティの型がわからないため、コンパイラは拡張メソッドを呼び出そうとしていると推測できません。したがって、インスタンス メソッドとして解釈Any()され、そのようなメソッドは実際には存在しないため、実行時に失敗します。

上記の明示的な構文を使用するように変更しても、正しくコンパイルされません。これは、e.items のタイプがまだ認識されていないためです。したがって、キャストする必要があります。

Dim result = Enumerable.Any((CType(e.items, List(Of String))), Function(y) y.Length > 4)

可能であれば、ExandoObject の使用を避けることをお勧めします。Linq は、静的に型指定されたオブジェクトに対してクエリを実行するためのものです。

于 2013-01-11T20:51:25.143 に答える
0

それはできますがe.items、適切な型にキャストする必要があります。

dim result = DirectCast(e.items, List(of String)).any(function (y) y.length > 4)
于 2013-01-11T20:53:18.377 に答える