Информация об изменениях

Сообщение Ambiguous user defined conversions от 30.04.2019 15:37

Изменено 30.04.2019 15:39 Qbit86

Ambiguous user defined conversions
Добрый вечер!

Почему не компилируется неявная пользовательская конверсия в контексте кортежей? Какой пункт спецификации это описывает?
Если на то есть уважительные причины, то почему тогда компилируются другие пользовательские конверсии?

internal readonly struct Pair
{
    public Pair(string name, string type)
    {
        Name = name;
        Type = type;
    }

    internal string Name { get; }
    internal string Type { get; }

    public override string ToString() => $"{Name}: {Type}";

    public static implicit operator Pair((string, int) t) => new Pair(t.Item1, "int");

    public static implicit operator Pair((string, uint) t) => new Pair(t.Item1, "uint");
}

internal static class Program
{
    private static void Render(Pair pair)
    {
        System.Console.WriteLine(pair.ToString());
    }

    private static void Main()
    {
        const uint u = 23;
        Render(("u", u)); // u: uint

        const int m = -1;
        Render(("-", m)); // -: int

        const int i = 42;
        Render(("i", i)); // Error CS0457

        var t = ("t", i);
        Render(t); // t: int
    }
}


Текст ошибки:

Ambiguous user defined conversions 'Pair.implicit operator Pair((string, int))' and 'Pair.implicit operator Pair((string, uint))' when converting from '(string, int i)' to 'Pair'

Ambiguous user defined conversions
Добрый вечер!

Почему не компилируется неявная пользовательская конверсия в контексте кортежей? Какой пункт спецификации это описывает?
Если на то есть уважительные причины, то почему тогда компилируются другие пользовательские конверсии?

internal readonly struct Pair
{
    public Pair(string name, string type)
    {
        Name = name;
        Type = type;
    }

    internal string Name { get; }
    internal string Type { get; }

    public override string ToString() => $"{Name}: {Type}";

    public static implicit operator Pair((string, int) t) => new Pair(t.Item1, "int");

    public static implicit operator Pair((string, uint) t) => new Pair(t.Item1, "uint");
}

internal static class Program
{
    private static void Render(Pair pair)
    {
        System.Console.WriteLine(pair);
    }

    private static void Main()
    {
        const uint u = 23;
        Render(("u", u)); // u: uint

        const int m = -1;
        Render(("-", m)); // -: int

        const int i = 42;
        Render(("i", i)); // Error CS0457

        var t = ("t", i);
        Render(t); // t: int
    }
}


Текст ошибки:

Ambiguous user defined conversions 'Pair.implicit operator Pair((string, int))' and 'Pair.implicit operator Pair((string, uint))' when converting from '(string, int i)' to 'Pair'