Порядок неявных преобразований в c # - PullRequest
0 голосов
/ 04 декабря 2018

Каков порядок неявных преобразований, выполняемых в Console.WriteLine (x), когда x является объектом из определенного пользователем класса:

    class Vector
    {
        public int x = 12;       

        public static implicit operator double(Vector v1)
        {
            return 3.14;
        }

        public static implicit operator int(Vector v1)
        {
            return 42;
        }

        public override string ToString()
        {
            return this.x.ToString();
        }

    }

    static void Main(string[] args)
    {
        Vector v11 = new Vector();
        Console.WriteLine(v11);
    }

Почему я получаю 42, а не 3.14 или "12"?Почему я не могу добавить дополнительное неявное преобразование в строку / существует ошибка компилятора в неоднозначности между CW (int) и CW (string) /:

        public static implicit operator string(Vector v1)
        {
            return "42";
        }

Я знаю, что следует избегать использования неявного приведения,но просто для любопытства!

1 Ответ

0 голосов
/ 04 декабря 2018

То, что печатается, полностью основано на том, какая перегрузка Console.WriteLine выбрана.Какая перегрузка выбрана, основана на разделе 7.5.3.2 спецификации «betterness» для членов функции.

Перегрузка «лучше», чем у другого, когда она имеет параметр, который «более специфичен», чем другойодин.«более конкретный» означает, что существует неявное преобразование из более конкретного типа в менее конкретный тип, и нет неявное преобразование из менее определенного типа в более конкретный тип.

objectявляется наименее специфичной перегрузкой, поскольку не существует неявного преобразования из нее в тип int, double или string, но существует один тип для каждого типа.int более специфичен, чем double, потому что есть неявное преобразование из int в double, но нет преобразования из double в int.int и string не имеют неявных преобразований между собой, поэтому ни один из них не является более конкретным, и поэтому ни один из них не лучше и не хуже, чем другой.

Так что, если существует неявное преобразование вашего объекта в string, тогда строкаПерегрузка считается, и есть связь для «лучшей» перегрузки, и вы получаете ошибку.Когда он отсутствует, существует «самый специфический» тип всех рассмотренных перегрузок (который int), поэтому он «лучший», и эта перегрузка выбрана.

...