次の方法で共有


コンパイラ エラー CS0457

更新 : 2007 年 11 月

エラー メッセージ

'型名 1' から '型名 2' へ変換するときの、あいまいなユーザー定義の変換 '変換メソッド名 1' および '変換メソッド名 2' です

適用可能な変換メソッドが 2 つ存在し、どちらを使えばよいかコンパイラが判断できません。

このエラーが発生する状況としては、次のようなケースが挙げられます。

  • クラス A をクラス B に変換したいとします。ここで、両者の間に関連性はありません。

  • A は A0 から派生しており、A0 から B への変換を行うメソッドが存在します。

  • B は B1 というサブクラスを持ち、A から B1 への変換を行うメソッドが存在します。

コンパイラは、2 つの変換メソッドに対して同等のウェイトを置きます。なぜなら、A0 から B の変換を選択した場合は変換先の型が最適であり、A から B1 の変換を選択した場合は変換元の型が最適であると見なすためです。どちらを使用するべきかコンパイラが判断できず、このエラーが生成されます。このエラーを解決するには、A を B に変換する明示的なメソッドを新たに記述します。

A を B に変換する 2 つのメソッドが存在する場合にもこのエラーが発生します。これを解決するには、使用する変換を、明示的なキャストによって指定する必要があります。

使用例

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

// CS0457.cs
using System;
public class A { }

public class G0 {  }
public class G1<R> : G0 {  }

public class H0 {
   public static implicit operator G0(H0 h) {
      return new G0();
   }
}
public class H1<R> : H0 {
   public static implicit operator G1<R>(H1<R> h) {
      return new G1<R>();
   }
}

public class Test 
{
   public static void F0(G0 g) {  }
   public static void Main() 
   {
      H1<A> h1a = new H1<A>();
      F0(h1a);   // CS0457
   }
}