Почему я не могу определить неявные и явные операторы? - PullRequest
30 голосов
/ 18 апреля 2009

Почему я не могу определить как неявные, так и явные операторы?

    public class C
    {
        public static implicit operator string(C c)
        {
            return "implicit";
        }

        public static explicit operator string(C c)
        {
            return "explicit";
        }
    }

Вы можете сделать это взломать хотя:)

    class Program
    {
        public class A
        {

        }

        public class B
        {
            public static implicit operator A(B b)
            {
                Console.WriteLine("implicit");
                return new A();
            }
        }

        public class C : B
        {
            public static explicit operator A(C c)
            {
                Console.WriteLine("explicit");
                return new A();
            }
        }

        static void Main(string[] args)
        {
            C c = new C();

            A a = c;
            A b = (A) c;
        }
    }

Это печатает:

implicit
explicit

Ответы [ 2 ]

45 голосов
/ 05 июня 2012

Проверьте это: Почему не может сосуществовать неявный и явный оператор одного типа в C #?

Если вы определите явный оператор, вы сможете сделать что-то вроде этого:

Thing thing = (Thing)"value";

Если вы определили неявный оператор, вы все равно можете сделать выше, но вы также можете воспользоваться неявным преобразованием:

Thing thing = "value";

Короче говоря, явное позволяет только явное преобразование, в то время как неявное допускает как явное, так и неявное ... отсюда причина, по которой вы можете определить только одно.

9 голосов
/ 18 апреля 2009

Я не знаю технических ограничений, которые мешают этому, но я думаю, что они сделали бы это, чтобы люди не отстреливались.

string imp = new C(); // = "implicit"
string exp = (string)new C(); // = "explicit"

Это может свести меня с ума и не имеет смысла, C следует приводить только в строку 1, а не 2 разными способами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...