Я пытаюсь найти некоторую информацию о разрешении перегрузки метода в случае наличия пользовательских неявных преобразований и о приоритете преобразований.
Этот код:
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)