0

次の拡張メソッドを想定します。

public static string ToFooBarString(this object obj)
{
...
}

public static string ToFooBarString< T >(this IEnumerable< T > obj)
{
...
}

今、私はこれをIEnumerable<T>インターフェイスの実装を介して呼び出します。

Dictionary< int , string > f; // implements IEnumerable< KeyValuePair< int , string > >
f.ToFooBarString(); // <--- which one is called?

この場合、どちらが呼び出されますか。また、その理由は何ですか。

4

2 に答える 2

4

コンパイラは、問題の型に「最も近い」オーバーロードを選択します。したがって、2 番目のオーバーロードが選択されます。(コンパイラがそれを理解できない場合、あいまいであると文句を言います。)

「オブジェクト」は階層の最上位にあるため、他の適用可能なオーバーロードが最初に使用されます。

さらに重要なことは、これは、テストや多数の本、オンライン記事、ドキュメント、ブログなどを読むことで発見できるということです。ここに投稿するよりも、少しグーグルで調べた方が早く発見できたはずです。

于 2012-04-27T17:14:30.283 に答える
3

2 番目のメソッドが呼び出されます。これは、型の変換規則に基づいています。

C# 言語仕様のオーバーロードの解決を参照してください。具体的には、変換の競合がどのように解決されるかについて説明している7.4.2.3を参照してください。

于 2012-04-27T17:19:18.460 に答える