12

それで、私はServy(https://stackoverflow.com/a/15098242/496680)による答えに出くわしました、そして彼のコードのいくつかはこれをします:

public static int BinarySearch<TSource, TKey>(...)

拡張メソッドの場合ですが、彼はそれを次のように呼び出します。

arr.BinarySearch(...)

私は周りに尋ねました、そして誰かがそれが暗黙のジェネリック型パラメーターであると思いました。私はそれらをグーグルで検索しましたが、それらに関する情報は見つかりませんでした。ジェネリックがどのように機能するかは理解していますが、これらをいつどのように使用するかを理解できていません。

  1. なぜservyは彼の拡張方法でそれらを使用するのですか?
  2. 私が検索できるこれらのより正式な名前はありますか?
4

3 に答える 3

11

さて、あなたはそれをすべて機能させる最も重要な部分を省略しました。タイプパラメータは、渡された実際のオブジェクトパラメータから推測できます。

例えば:

static class Extensions {
  internal static IEnumerable<U> Test<T, U>(
                                   this IEnumerable<T> items,
                                   Func<T, U> converter) {
    foreach (T item in items) {
      yield return converter(item);
    }
  }
}

この拡張メソッドは、任意のIEnumerableクラスで機能し、指定したコンバーターに基づいて、列挙内の各項目を別のタイプに変換します。これは標準的なジェネリックです。

現在、このメソッドを呼び出す方法はたくさんあります。

IEnumerable<int> values = Enumerable.Range<int>(1, 10);
Func<int, string> converter = i => i.ToString("0.00");

// Variation 1, explicit calling
IEnumerable<string> results1 = Extensions.Test<int, string>(values, converter);

// Variation 2, explicit calling with type inference
IEnumerable<string> results2 = Extensions.Test(values, converter);

// Variation 3, extension method calling, still providing explicit types
IEnumerable<string> results3 = values.Test<int, string>(converter);

// Variation 4, extension method with type inference
IEnumerable<string> results4 = values.Test(converter);

4つのバリエーションはすべて同じメソッドを呼び出し、同じ結果を返します。型推論は、渡されたパラメーターを調べ、提供されているものに基づいてそれらの型を自動的に推論することによって機能します。上記の例では、のパラメータにを渡したため、型Tが型であると判断できます。また、 withの初期型と一致するFuncを渡して文字列を返すため、型が型であると推測することもできます。したがって、はのコンバーター関数で埋められます。intIEnumerable<int>IEnumerable<T>UstringTintFunc<T, U>Func<int, string>

上記の推論から、それはその時点での標準的なジェネリックメソッドです。型推論と拡張の方法は、便利さ/構文上の糖衣にすぎません。実際、出力を逆コンパイルすると、拡張メソッドが静的呼び出しに置き換えられ、通常は明示的に入力された型パラメーターで定義されていることがわかります。(これは、逆コンパイラーと設定されたオプションによって異なります)。

于 2013-02-26T21:54:45.370 に答える
6
  1. この場合、彼のメソッドは。に含まれる任意の型で機能できるため、ジェネリックメソッドを使用しCollection<T>ます。ジェネリックメソッドはこれを非常に柔軟にし、あらゆるタイプに使用できます。彼は、メソッドを呼び出すときに型推論を使用します。これは、呼び出しサイトのコードを単純化するためです。

  2. 自動処理は型推論と呼ばれ、C#言語仕様のセクション7.5.2:型推論で詳しく説明されています。詳細を理解したい場合は、C#言語仕様をダウンロードすることをお勧めします。

于 2013-02-26T21:43:11.227 に答える
2

私がよく耳にする用語は「型推論」です。

于 2013-02-26T21:39:54.503 に答える