Поскольку спецификация C # гласит:
Метод расширения Ci.Mj подходит, если:
· Ci - неуниверсальный, не вложенный класс
· Имя Mj является идентификатором
· Mj доступен и применим при применении к аргументам в качестве статического метода, как показано выше
· Неявное преобразование идентификатора, ссылки или бокса существуетexpr для типа первого параметра Mj.
Что касается спецификации C #, пользовательский оператор преобразования отличается от неявного ссылочного преобразования и, безусловно, отличается от тождества илипреобразование бокса.
Для подсказки, почему:
public static class Extensions
{
public static void DoSomething(this Bar b)
{
Console.Out.WriteLine("Some bar");
}
public static void DoSomething(this Boo b)
{
Console.Out.WriteLine("Some boo");
}
}
public class Foo
{
public static implicit operator Bar(Foo f)
{
return new Bar();
}
public static implicit operator Boo(Foo f)
{
return new Boo();
}
}
public class Bar { }
public class Boo { }
public class Application
{
private Foo f;
public void DoWork()
{
// What would you expect to happen here?
f.DoSomething();
// Incidentally, this doesn't compile either:
Extensions.DoSomething(f);
}
}
C # не может однозначно выбрать, какое неявное преобразование выполнить.