Я думаю Вы обнаружили ошибку компилятора :
Хотя метод расширения будет скомпилирован для использования статического метода, похоже, компилятор не проверяетэто , так как на момент компиляции он существует в формате вызова метода экземпляра .
Причина здесь.Если я объявлю второй метод:
[Obsolete("Do Not Use", true)]
public static class Extensions
{
public static int Squared(this Dummy Dummy)
{
return Dummy.x * Dummy.x;
}
public static int Squared2(Dummy Dummy)
{
return Dummy.x * Dummy.x;
}
}
Теперь он жалуется на 3-й строке, а не второй:
class Program
{
static void Main(string[] args)
{
var d = new Dummy(42);
Console.WriteLine(String.Format("{0}^2={1}", d, d.Squared())); // Fine!?
Console.WriteLine(String.Format("{0}^2={1}", d, Extensions.Squared2(d))); // COmplains as expected
}
}