我有一个接受参数T
的扩展方法。此参数是数字类型,如下所示之一:byte,short,int和long。
我需要检查T
是否等于0.如何做到这一点?
public static void WriteFlaggedValue<T>(this OutPacket outPacket, uint flag, T value, ref uint outputFlag) where T : struct,
IComparable,
IComparable<T>,
IConvertible,
IEquatable<T>,
IFormattable
{
if (value == 0)
{
}
}
答案 0 :(得分:5)
您可以像这样使用EqualityComparer
类
if(EqualityComparer<T>.Default.Equals(value, default(T))
{
}
Stackoverflow:EqualityComparer<T>.Default vs. T.Equals
答案 1 :(得分:1)
您必须执行此操作的一个选项是使用compareTo
界面的IComparable
方法,default type value ...
如果它们是等于它将返回零为is specified here。
条件如下:
if (value.CompareTo(default(T)) == 0)
在您的方法中使用:
public static void WriteFlaggedValue<T>(this OutPacket outPacket, uint flag, T value, ref uint outputFlag) where T : struct,
IComparable,
IComparable<T>,
IConvertible,
IEquatable<T>,
IFormattable
{
if (value.CompareTo(default(T)) == 0)
{
}
}
如果值可以是null
,那么你必须处理它。
答案 2 :(得分:0)
怎么样:
private T _minimumValue = default(T)
public bool IsEqualsZero(T value)
{
return (value.CompareTo(_minimumValue) == 0);
}
中所述
答案 3 :(得分:0)
由于还没有人说过,为什么不简单地利用Equals(T other)
接口免费提供的非常简单的IEquatable<T>
函数:
if (value.Equals(default(T)))
{
// ...
}
关于使用default
关键字的说明,如果OP想知道这是如何工作的:
文档发现here,说明如下(强调我的):
解决方案是使用default关键字,对于引用类型将返回null,对于数值类型 将返回 零。
还应该提到的是,仅仅因为您将T
限制为struct
并不意味着您可以保证T
始终为数字。例如,您的方法可以接受DateTime
作为泛型类型。也许你已经知道了,并且没关系。
有关此内容的更多信息:What is the “base class” for C# numeric value types?