Разрешение перегрузки метода C # и определенные пользователем неявные преобразования - PullRequest
0 голосов
/ 12 ноября 2018

Я пытаюсь найти некоторую информацию о разрешении перегрузки метода в случае наличия пользовательских неявных преобразований и о приоритете преобразований.

Этот код:

class Value
{
    private readonly int _value;
    public Value(int val)
    {
        _value = val;
    }

    public static implicit operator int(Value value)
    {
        return value._value;
    }

    public static implicit operator Value(int value)
    {
        return new Value(value);
    }
}

class Program
{
    static void ProcessValue(double value)
    {
        Console.WriteLine("Process double");
    }

    static void ProcessValue(Value value)
    {
        Console.WriteLine("Process Value");
    }

    static void Main(string[] args)
    {
        ProcessValue(new Value(10));
        ProcessValue(10);
        Console.ReadLine();
    }
}

Производит продукцию:

Process Value
Process Value

Итак, похоже, что преобразователь выбрал пользовательское преобразование вместо встроенного неявного преобразования из int в double (встроенное преобразование неявно из-за информации с этой страницы https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/implicit-numeric-conversions-table).

Я пытался найти что-то об этом в спецификации, но безуспешно.

Почему компилятор выбрал ProcessValue(Value value) вместо ProcessValue(double value)

1 Ответ

0 голосов
/ 12 ноября 2018

В этом случае преобразование между int -> double имеет меньший приоритет, поскольку существует неявное пользовательское преобразование между int -> Value.

См .: Пользовательские реализации операторов всегда имеют приоритет над предопределенными реализациями операторов .

...