使用扩展方法检查值是否为0

Izz*_*zzy 22 c#

我有一个看起来像的扩展方法

public static T ThrowIfObjectIsNull<T>(this T argument) where T : class
{
  if (argument == null)
      throw new ArgumentNullException(nameof(argument));

   return argument;
}
Run Code Online (Sandbox Code Playgroud)

这基本上检查传递的对象是否为空.我想要做的是创建另一个扩展方法,int其中传入的值不是0.所以我继续创建:

public static T ThrowIfZero<T>(this T argument) where T : struct
{
   if (argument == 0)
     throw new ArgumentOutOfRangeException("some error here");

   return argument;
}
Run Code Online (Sandbox Code Playgroud)

当然上面没有编译提示错误:

错误CS0019运算符'=='不能应用于'T'和'int'类型的操作数

有人能指出我如何检查参数值是否正确0

Tim*_*ter 23

你可以简单地使用Equals:

public static T ThrowIfZero<T>(this T argument) where T : struct
{
    if (argument.Equals(0))
        throw new ArgumentOutOfRangeException("some error here");

    return argument;
}
Run Code Online (Sandbox Code Playgroud)

但是,如果参数是例如小数0.0m,它不等于0Peter正确评论的整数,那么这将无法正常工作.

因此,如果您想要一个适用于任何数字的版本,您可以使用此方法:

public static T ThrowIfZero<T>(this T argument) where T : struct
{
    bool isZero = Decimal.Compare(0.0m, Convert.ToDecimal(argument)) == 0;
    if (isZero)
        throw new ArgumentOutOfRangeException("some error here");

    return argument;
}
Run Code Online (Sandbox Code Playgroud)

  • 或者`IEquatable <T>`,我不确定你需要演员,`argument.CompareTo(0)`应该编译得很好. (4认同)
  • 这个解决方案只适用于`int`.使用`0L`或'0.0`,`CompareTo(0)`版本将抛出运行时错误,因为`0`不是`Int64`或'Double`类型.在`Equals(0)`版本中,`0L`或`0.0`的类型不是'0`的类型,因此不将参数视为等于'0`并且不抛出异常.最后,这并不比向`T`添加`int`类型约束更好. (2认同)

par*_*par 12

您也可以使用EqualityComparer.

public static T ThrowIfZero<T>(this T argument) where T : struct
{   
     if (EqualityComparer<T>.Default.Equals(argument, default(T)))   
        throw new ArgumentOutOfRangeException("some error here");

     return argument;
}
Run Code Online (Sandbox Code Playgroud)

你可以参考这篇文章的答案(功劳应该去@Mehrdad).