0

我打算在 上创建一个In扩展方法int,当我意识到,如果我使用 IEquatable 我将获得所有原始类型的扩展。这是我目前的实现

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))于整数,但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 回答