1

実装目的で C# で FSharpList を使用しようとしています。インターフェイスを実装しているとのことIEnumerableですが、そのインスタンスを作成するとGetEnumerator機能がありません!

4

1 に答える 1

4

ただし、IEnumerable にキャストするか、foreach で使用する必要があります。明示的に定義されているため、宣言された型が IEnumerable でない限り、インテリセンスには表示されません

編集 コメントから、上記が予想とは異なる方法で読み取られる可能性があることに気付きました。

インターフェイス メソッドの明示的な実装は、基本的に曖昧さ回避メカニズムの一部です。型が同じシグネチャ (戻り値の型を無視) を持つ 1 つ以上のメソッドを持つ 2 つのインターフェイスを実装する場合、それらを区別できる必要があります。

最初の部分は、それらの一方または両方を明示的に実装することです。ForIEnumerableIEnumerable<T>それは以下のコードに似ています

object IEnumerable.GetEnumerator(){...}
T IEnumerable<T>.GetEnumerator(){...}

明確化の 2 番目の部分は呼び出しサイトにあります。どちらのメソッドもオブジェクトの実行時型の一部ですが、通常の呼び出し構文を使用して呼び出すことはできません。メソッドを定義したコンパイル時の型をコンパイルに伝える必要があります。そうしないと、コンパイラはどのメソッドを呼び出すべきかわかりません。

したがって、上記の 2 つのメソッドを呼び出すには、次のようなコードが必要です。

((IEnumerable)obj).GetEnumerator();
((IEnumerable<T>)obj).GetEnumerator();

または、言語構造に任せてキャストすることもできます (この場合、言語仕様により、どのバージョンが呼び出されるかがわかります)

foreach(var item in obj) {
}

したがって、メソッドは実際にはオブジェクトの型の一部ですが、コンパイル時にコンパイラを支援し、呼び出したい特定のメソッドを定義した型をコンパイラに伝える必要があります。

もちろん、明示的な実装はあいまいさなしに使用できます。

于 2012-09-26T20:46:35.307 に答える