コンパイル時まで型の定義が遅れているので、intellisense(と何か関係するもの)はどのように拡張していますか? C#はデフォルトでSystem.Objectのトップレベルに設定されていますか?
System.Object
の拡張であると言われるものは間違っています。 1つは、このメソッドはボックス値の入力を行いませんが、System.Object
に定義されている拡張メソッドが適用されます。
定義した拡張メソッドは、一般的にパラメータ化された拡張メソッドです。ジェネリック型パラメータとして有効な任意のタイプに適用できます。
拡張メソッドについて次のように考えていないのであれば、これを少し良く理解するのに役立ちます。拡張メソッドは、言語仕様が私たちを取り除くことを可能にするトリックです。拡張メソッドは、実際にインスタンスメソッドであるかのように呼び出すことができる静的クラスの静的メソッドです。したがって
static class Foo {
public static void M(this object obj) { }
}
は静的クラスの単なる静的メソッドです。
Foo.M(obj);
が、我々はそれがインスタンスメソッドだようにそれを呼び出すことができます:あなたはこのようにそれを呼び出すことができますこのように
obj.M();
、あなたは一般的な拡張メソッドを持っている場合、分停止し、それについて考えます静的クラスの静的メソッド
static class Foo {
public static void M<T>(this T obj) { }
}
としてあなたはこのようにそれを呼び出すことができます。
object obj;
Foo.M(obj);
またはあなたはこのようにそれを呼び出すことができますが:
obj.M();
あなたが書いたコンパイラには違いありません。
これで、通常の一般的な方法と考えています。しかし、この観点から考えると、コンパイラーはジェネリック型パラメーターとして有効な任意の型でこのメソッドを呼び出せることを理解しているはずです。したがって、ジェネリック型パラメータとして有効な任意の型の拡張メソッドと考えることができる理由を理解できました。
LINQとは何が関係していますか? – BoltClock
@ BoltClock'saUnicorn linqの流暢なsytnaxは拡張メソッドに基づいています。 –
@ RoINamir LINQが拡張メソッドに基づいているという事実は、すべての拡張メソッドLINQを関連付けるわけではありません。 – Servy