2

演習の一環として、特定の型で使用した場合のジェネリック クラスの特定の動作を定義しようとしています。より正確には、ジェネリック型の明示的なキャスト演算子、つまり from list<T>toを定義できるかどうか疑問に思っていました。int[]

いいえ、作業を行うメソッドを単純に定義できることはわかっていますが、これは演習の目標ではありません。

list<T>次の明示的なキャストメソッドを定義しようとしていたジェネリッククラスを想定しています

class list<T> {
...

    public static explicit operator int[](list<T> _t) where T : System.Int32 
    {
        // code handling conversion from list<int> to int[]
    }
}

ただし、これは機能しません。コンパイラにこれを飲み込ませる方法についてのアイデアはありますか?

4

1 に答える 1

4

まず、クラスの名前を .NET の規則に従って変更し、.NETの衝突を避けるようにしてくださいList<T>

それが邪魔にならないと、基本的にあなたがやろうとしていることはできません。すべてのに対して有効な変換を定義し、ケースごとに異なるアクションを実行できます。したがって、次のように書くことができます。 T

public static explicit operator T[](CustomList<T> input)

である場合Tは、これを別の方法で扱いintます。最後の部分を行うのは良くありませんが、本当にしたい場合は行うことができます.

特定のジェネリック型で使用できるメンバーは、型引数が何であれ (型パラメーター宣言の時点で宣言された制約内で) 同じです。それ以外の場合は、実際にはジェネリックではありません。

別の方法として、他の場所で最上位の静的非ジェネリック型で拡張メソッドを定義することもできます。

public static int[] ToInt32Array(this CustomList<int> input)
{
    ...
}

それはあなたが書くことを可能にするでしょう:

CustomList<int> list = new CustomList<int>();
int[] array = list.ToInt32Array();

個人的には、とにかく明示的な変換演算子よりも明確だと思います。

于 2012-10-07T08:28:20.880 に答える