インターフェイス型からジェネリック構造体型にユーザー定義のキャスト演算子を使用しようとすると、型を変換できないことを示すコンパイルエラーが発生します。
public interface J { }
public struct S<T> {
public static explicit operator S<T>(T value) {
return new S<T>();
}
}
public static class C {
public static S<J> Test(J j) {
return (S<J>)j; // <- error: cannot convert type 'J' to type 'S<J>'
}
}
Jがクラスの場合、変換は機能することに注意してください。
クラスへの変換についても同様の質問があります。その答えは、派生クラスがインターフェイスを実装し、ユーザー定義のキャストを使用する必要があるかどうかについてあいまいさを生み出す可能性があるということです。しかし、構造体の場合、派生型は存在できず、コンパイラーは、私の構造体がJを実装していないことを認識しています。
おそらく、インターフェースが新しいインターフェースを実装するときに、予期しないセマンティックの変更を回避するためですか?多分それはただの偶然ですか?多分私は素朴な間違いを犯していますか?スペックからの引用は素晴らしいのですが、そもそもそのように設計された理由が本当に欲しいです。