更新 : 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;
}
}
}