我打算在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>
看起来对我来说不对。这是定义泛型方法的正确方法吗?
答案 0 :(得分:1)
请勿使用this T value
作为方法参数,而是使用this IEquatable<T> value
。那么你不需要对T的约束,你也只为IEquatable定义它。
答案 1 :(得分: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;
}
答案 2 :(得分:1)
是的,这是正确的。 (不知道还有什么要说的。我已经定义了相同的方法,虽然我开始相信我不喜欢它的风格,但它的工作正常。当然,这是主观的。)
答案 3 :(得分:0)
where T: IEquatable<T>
是generic constraint,所以它非常好,而且是限制使用通用方法/类/使用有限类型集合的首选方法。