C#方法重载分辨率和用户定义的隐式转换

时间:2018-11-12 13:22:30

标签: c# implicit-conversion .net-4.6.1

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

此代码:

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 :(得分:3)

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

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