0

IEquatableを使用すると、すべてのプリミティブ型で拡張機能を取得できることに気付いたときに、In拡張メソッドを作成しようとしていました。intこれは私の現在の実装です

public static bool In<T>(this T value, params T[] values) where T : IEquatable<T>
{
    return values.Contains(value);
}

if(i.In(1,3,7))intには問題なく機能しますが、where T: IEquatable<T>私には間違っているように見えます。これはジェネリックメソッドを定義する正しい方法ですか?

4

4 に答える 4

1

this T valueメソッドの引数として使用しないでくださいthis IEquatable<T> value。代わりに使用してください。次に、 T に対する制約は必要なく、 IEquatable に対してのみ定義します。

于 2012-11-27T15:45:42.757 に答える
1

あなたが持っているものは私には正しいように見えます。IEquatable<T>タイプは独自のタイプ を実装する必要があると言っています。

比較対象の型は、 を実装する別の型である可能性があると言って拡張することもできIEquatable<T>ますvalue

public static bool In<T, U>(this T value, params U[] values) where U : IEquatable<T>
{
    bool result = false;
    foreach (U instance in values)
    {
        if (instance.Equals(value))
        {
            result = true;
            break;
        }
    }
    return result;
}
于 2012-11-27T15:47:04.860 に答える
1

はい、これは正しいです。(他に何を言うべきかわかりません。同じメソッドを定義しましたが、うまく機能しますが、そのスタイルが気に入らないと信じるようになりました。もちろん、それは主観的です。)

于 2012-11-27T15:47:07.637 に答える
0

where T: IEquatable<T>ジェネリック制約であるため、これは完全に適切であり、さらに、限られたタイプのセットでジェネリックメソッド/クラス/その他の使用を制限するための推奨される方法です。

于 2012-11-27T15:58:14.237 に答える