C#3.5に次のコードを表現するために、とにかくがある場合だけで不思議:C#で汎用キャスト演算子を次のようにオーバーロードすることは可能ですか?
public struct Foo<T> {
public Foo(T item) {
this.Item = item;
}
public T Item { get; set; }
public static explicit operator Foo<U> (Foo<T> a)
where U : T {
return new Foo<U>((U)a.Item)
}
}
おかげ
ユーザー定義の汎用コンバージョンをサポートしていても、このコンバージョンは依然として違法です。組み込みの変換を置き換える変換を定義することは不正です。これはTとUが同じ型であればそうするでしょう。アイデンティティ変換を置き換えます。 –
キャストはコンパイラによって決定されるため、TとUが同じ型の場合、ユーザー定義キャストは使用されず、リーガルになります。 –