編譯器錯誤 CS0457
更新:2007 年 11 月
錯誤訊息
從 'type name 1' 轉換為 'type name 2' 時,發現模稜兩可的使用者定義轉換 'Conversion method name 1' 和 'Conversion method name 2'
由於這兩個轉換方法都適用,編譯器無法決定使用哪一個。
下列案例便會造成這個錯誤:
您要將類別 A 轉換為類別 B,但 A 和 B 不相關。
A 是衍生自 A0,並且有從 A0 轉換為 B 的方法。
B 有子類別 B1,並且有從 A 轉換為 B1 的方法。
編譯器會平等權衡這兩個轉換方法,因為第一個轉換提供最佳的目的型別,第二個轉換則提供最佳的來源型別。由於編譯器無法選擇,因此會產生這個錯誤。若要解決,請撰寫一個新的明確轉換方法,將 A 轉換為 B。
另一個會造成這個錯誤的案例是,有兩個方法可將 A 轉換為 B。若要修正錯誤,請透過明確轉換指定要使用哪一個轉換方法。
範例
下列範例會產生 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
}
}