次の方法で共有


コンパイラ エラー CS0034

更新 : 2007 年 11 月

エラー メッセージ

演算子 'operator' は型 'type1' と 'type2' のオペランドに対してあいまいです。

1 つの演算子が 2 つのオブジェクトで使用されており、複数の変換が見つかりました。変換は一意であることが必要です。したがって、キャストを行うか、または変換のうちの 1 つを明示的にする必要があります。詳細については、「変換演算子 (C# プログラミング ガイド)」を参照してください。

次の例では CS0034 エラーが生成されます。

// CS0034.cs
public class A
{
   // allows for the conversion of A object to int
   public static implicit operator int (A s)
   {
      return 0;
   }

   public static implicit operator string (A i)
   {
      return null;
   }
}

public class B
{
   public static implicit operator int (B s)
   // one way to resolve this CS0034 is to make one conversion explicit
   // public static explicit operator int (B s)
   {
      return 0;
   }

   public static implicit operator string (B i)
   {
      return null;
   }

   public static implicit operator B (string i)
   {
      return null;
   }

   public static implicit operator B (int i)
   {
      return null;
   }
}

public class C
{
   public static void Main ()
   {
      A a = new A();
      B b = new B();
      b = b + a;   // CS0034
      // another way to resolve this CS0034 is to make a cast
      // b = b + (int)a;
   }
}

C# 1.1 では、コンパイラのバグにより、int と bool の両方への暗黙のユーザー定義の変換を行うクラスを定義でき、ビットごとの AND 演算子 (&) をその型のオブジェクトに使用することが可能でした。C# 2.0 では、このバグが修正され、コンパイラが C# 仕様に準拠するようになったため、次のコードによって CS0034 が発生するようになりました。

namespace CS0034
{
    class TestClass2
    {
        public void Test()
        {
            TestClass o1 = new TestClass();
            TestClass o2 = new TestClass();
            TestClass o3 = o1 & o2; //CS0034
        }
    }

    class TestClass
    {
        public static implicit operator int(TestClass o)
        {
            return 1;
        }

        public static implicit operator TestClass(int v)
        {
            return new TestClass();
        }

        public static implicit operator bool(TestClass o)
        {
            return true;
        }
    }

    
}