Не совсем ответ, но слишком длинный, чтобы поместиться в разделе комментариев ...
Давайте рассмотрим следующий пример, который, на мой взгляд, довольно распространен:
public class DoubleSet : List<double>
{
public IEnumerable<double> Square()
{
return this.Select( x => x*x );
}
}
ЭтоСовершенно верно, что this
не является необходимым для компилятора для правильной интерпретации метода Select.
Однако я думаю, что в некотором смысле наложение точечной нотации подчеркивает тот факт, что мы имеем дело сметод расширения и, таким образом, метод расширения будет обращаться к членам текущего экземпляра только через открытые методы доступа, даже если вы вызываете его в закрытой области видимости класса .
Для читателя кода ясно, что метод расширения будет обрабатывать экземпляр this, как если бы он ничего не знал о его внутреннем состоянии.И действительно, класс объекта совершенно неизвестен методу расширения (поскольку метод расширения знает только интерфейс)
Если бы код был только:
public IEnumerable<double> Square()
{
return Select( x => x*x );
}
, это было бы намного меньшеОчевидно, что вы имеете дело с IEnumerable.Select, который фактически вызывает IList.GetEnumerator и заставляет каждый элемент один за другим вызывать функцию x => x * x.