C#では、次の方法で汎用キャスト演算子をオーバーロードできますか?
-
06-07-2019 - |
質問
C#3.5で次のコードを表現する方法があるかどうか疑問に思っています:
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)
}
}
ありがとう
解決
変換演算子はジェネリックにはできません。仕様セクション10.10から、conversion-operator-declaratorの形式は次のとおりです。
conversion-operator-declarator: implicit operator type ( type identifier ) explicit operator type ( type identifier )
たとえば、メソッドヘッダーと比較してください:
method-header : attributes opt method-modifiers opt partial opt return-type メンバー名 type-parameter-list opt ( formal-parameter-list opt ) type-parameter-constraints-clauses opt
(フォーマットについてはごめんなさい-どのようにそれを改善するかわからない。)
演算子形式には、型パラメーターリストまたは型パラメーター制約が含まれていないことに注意してください。
他のヒント
コードは次の行に要約されます:return new Foo<U>((U)a.Item)
ベースクラスを継承クラスに割り当てようとする場合、これは不可能です。
T(ベースクラス)がタイプStream
でUがタイプMemoryStream
(継承クラス)であるとしましょう。<=>をタイプ<=>の変数に割り当てることはできません。
短い答えは<!> quot;不可能だと思います。代わりにメソッドを使用してみてください<!> quot;
また、この質問にだまされているようです .NETジェネリックのオーバーロード演算子制約の解決策
所属していません StackOverflow