20

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)
    }
}

ありがとう

4

3 に答える 3

23

変換演算子をジェネリックにすることはできません。仕様セクション 10.10 から、変換演算子宣言子の形式は次のとおりです。

変換演算子宣言子:
    暗黙の演算子      (      識別子   )
    明示的な演算子   の型   (      識別子   )

これを、たとえばメソッド ヘッダーと比較します。

method-header : attributes opt メソッド修飾子opt部分opt 戻り値の型 メンバ名 型パラメータリストopt (正式パラメータリストopt ) 型パラメータ制約節opt

(書式については申し訳ありません - どうすればよいかわかりません。)

演算子の形式には、型パラメーター リストまたは型パラメーターの制約が含まれていないことに注意してください。

于 2009-06-22T06:12:14.463 に答える
2

コードは次のように要約されます。return new Foo<U>((U)a.Item)

継承されたクラスにベースクラスを割り当てようとする場合、これは不可能です。

T(基本クラス)が型StreamでUが型(継承クラス)であるとすると、型の変数にMemoryStreamaを割り当てることはできません。StreamMemoryStream

于 2009-06-22T05:48:02.557 に答える
0

簡単な答えは「不可能です。代わりにメソッドを使用してみてください」だと思います。

また、この質問の重複のようです。.NET ジェネリックのオーバーロードされた演算子制約の解決策

于 2009-06-22T06:19:23.543 に答える