C#では、次の方法で汎用キャスト演算子をオーバーロードできますか?

StackOverflow https://stackoverflow.com/questions/1025576

質問

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ジェネリックのオーバーロード演算子制約の解決策

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top