33

暗黙的演算子と明示的演算子の両方をそのように定義できないのはなぜですか?

    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
4

2 に答える 2

57

これを確認してください: C# で同じ型の暗黙的および明示的な演算子を共存できないのはなぜですか?

明示的な演算子を定義すると、次のようなことができます。

Thing thing = (Thing)"value";

暗黙の演算子を定義する場合でも、上記を行うことができますが、暗黙の変換を利用することもできます。

Thing thing = "value";

つまり、明示的には明示的な変換のみが許可されますが、暗黙的には明示的な変換と暗黙的な変換の両方が許可されます...したがって、1 つしか定義できない理由があります。

于 2012-06-05T06:48:15.070 に答える
9

これを防ぐ技術的な制限はわかりませんが、人々が自分の足を撃ち落とすのを防ぐためにこれを行ったと思います.

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

それは私を夢中にさせ、意味がありCません。2つの異なる方法ではなく、1つの方法で文字列にキャストする必要があります。

于 2009-04-17T21:23:54.463 に答える