用于匹配数字类型的通用约束

Tom*_*han 78 c# generics numeric

我正在尝试在数字类型上编写一个扩展方法,以便在我正在构建的流畅测试框架中使用.基本上,我想这样做:

public static ShouldBeGreaterThan<T>(this T actual, T expected, string message)
    where T : int || T: double || etc...
Run Code Online (Sandbox Code Playgroud)

只是where T : struct不这样做,因为这也将匹配stringbool,可能别的东西,我忘了.有什么我可以做的只匹配数字类型?(实现的具体类型><运营商,这样我就可以对它们进行比较.如果这意味着我匹配日期为好,它其实并不重要-扩展仍然会做我的期望.)

flq*_*flq 56

在这种情况下,您希望将泛型约束到IComparable接口,这使您可以访问该CompareTo方法,因为此接口允许您回答该问题ShouldBeGreaterThan.

数字类型将实现该接口,并且它也适用于字符串的事实不应该打扰你那么多.


Mar*_*k H 44

where T : struct, 
          IComparable, 
          IComparable<T>, 
          IConvertible, 
          IEquatable<T>, 
          IFormattable
Run Code Online (Sandbox Code Playgroud)

这是我能接近数字约束的最接近的.所有数字类型都实现了这5个接口,但是boor没有实现IFormattable,并且字符串是引用类型,所以它们不适用.

还有一些其他的东西可以实现这些 - 例如DateTime,所以它并不是真正需要的,但是会阻止很多你不想要的实例化.

  • 即便如此,我似乎无法使用常见的数学运算.`Operator'=='不能应用于'T'和'float'类型的操作数 (3认同)

Lee*_*Lee 16

public static bool IsGreaterThan<T>(this T actual, T comp) where T : IComparable<T>
{
    return actual.CompareTo(comp) > 0;
}
Run Code Online (Sandbox Code Playgroud)

如果需要,也可以添加结构约束.


Mar*_*ell 6

很难仅限于数字,因为没有什么常见的INumeric用作过滤器.实际上,我怀疑这里最简单的方法是不要坚持约束,并Comparer<T>.Default.Compare在方法中使用.

这种内置类型支持泛型IComparable<T>和非泛型IComparable,并支持ref类型,值类型和通过提升使用Nullable<T>.

对于全运营商的使用,看看MiscUtil的OperatorGreaterThan等,如果你这可能是有用真的想使用运营商(而不是接口).它还提供对其他运营商的访问等Add.


Jak*_*son 5

Stackoverflow充斥着这类问题. 看看这个搜索.C#不支持定义受数字约束的泛型类型的方法.遗憾的是,最好的办法是在所有对象上实现扩展方法,并根据类型进行切换,或者为int,double,float等创建一组方法.