Каков синтаксис C# для выбора неоднозначного определяемого пользователем оператора преобразования?

В C#, если есть неоднозначные определяемые пользователем операторы преобразования, можно ли выбрать один из них на сайте вызова?

Рассмотрим этот пример (аналогичный примерам в Неоднозначные неявные пользовательские преобразования в .NET и Неоднозначные пользовательские преобразования , при преобразовании из X в Y. C# .Net)

using System;

static class Program {
    class A {
        static public explicit operator A(B value) {
            Console.WriteLine("A");
            return new A();
        }
    }
    class B {
        static public explicit operator A(B value) {
            Console.WriteLine("B");
            return new A();
        }
    }
    public static void Main() {
        A a = (A)new B();
    }
}

Если один из операторов закомментирована, код скомпилируется. Это теоретический вопрос (практическое решение состоит в том, чтобы не использовать неоднозначные операторы преобразования), но есть ли какой-то специальный синтаксис в месте вызова для вызова одного из них конкретно (путем редактирования (A)new B())? Или это невозможно и заставляет переписывать классы?


person Victor    schedule 11.09.2020    source источник
comment
Если это возможно, я не знаю, как это можно сделать. Но я всегда считал, что компилятор должен просто выдать предупреждение для двойного (или тройного, кто знает) оператора X to Y.   -  person Franck    schedule 11.09.2020


Ответы (1)


спецификация языка C# говорит следующее:

  • Если U содержит только один определяемый пользователем оператор преобразования, который преобразует SX в TX, то это наиболее конкретный оператор преобразования.
  • В противном случае, если U содержит только один поднятый оператор преобразования, который преобразует SX в TX, то это наиболее конкретный оператор преобразования.
  • В противном случае преобразование будет неоднозначным и возникнет ошибка времени компиляции.

Итак, в основном это недопустимый код, и компилятор откажется его принять.

person Mike Fisher    schedule 11.09.2020