C# 方法重载解析和用户定义的隐式转换

C# Method overloading resolution and user-defined implicit conversions

我试图找到一些关于在存在用户定义的隐式转换的情况下方法重载解决方案以及关于转换优先级的信息。

此代码:

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)

在这种情况下,int -> double 之间的转换优先级较低,因为 int -> Value 之间存在用户定义的隐式转换。

参见:User-defined operator implementations always take precedence over predefined operator implementations