Методы расширения работают таким образом.
Согласно спецификации C # (7.6.5.2 Extension method invocations
), методы расширения используются только в том случае, если вызов имеет «одну из форм»:
expr . identifier ( )
expr . identifier ( args )
expr . identifier < typeargs > ( )
expr . identifier < typeargs > ( args )
Это в основном означает, что у вас всегда должно быть что-то слева от "." чтобы компилятор разрешил метод расширения. expr.
часть должна существовать (а не быть dynamic
), чтобы компилятор искал метод расширения.
Например, вот небольшой тест, который демонстрирует:
namespace TestNamespace
{
using System;
public static class TextExtension
{
public static void Print(this Test test)
{
Console.WriteLine("Found");
}
}
public class Test
{
public void Foo()
{
// Compiler error!
Print();
// Works fine
this.Print();
}
static void Main()
{
Test test = new Test();
test.Foo();
// Fine here
test.Print();
Console.ReadKey();
}
}
}
Обратите внимание на ошибку компилятора - поскольку мы находимся внутри экземпляра Test, вы не можете напрямую вызвать Print()
без использования this.
. Тем не менее, мы можем легко выполнить test.Print()
(или this.Print()
внутри Test).