Почему нам нужен явный метод преобразования incase od Extension, а не статические методы? - PullRequest
0 голосов
/ 17 февраля 2012

Почему методы расширения не используют неявные преобразования, а статические методы?Кто-нибудь может объяснить с надлежащим примером?

Спасибо

1 Ответ

1 голос
/ 17 февраля 2012

Поскольку спецификация 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 # не может однозначно выбрать, какое неявное преобразование выполнить.

...