我有一个看起来像的扩展方法
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)
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).