Будучи тем, что я отложил определение типа до момента компиляции, как intellisense (и все, что связано с ним) знает, какого типа я расширяю? Действительно ли C# по умолчанию используется для верхнего уровня System.Object?
Те, кто говорят, что это расширение на System.Object
, являются неправильными. Во-первых, этот метод не будет вводить значения типа ввода, но метод расширения, определенный на 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 весь беглый sytnax в linq основан на методах расширения. –
@RoyiNamir Тот факт, что LINQ основан на методах расширения, не делает все связанные с LINQ методы расширения. – Servy