通用数字类型
本文关键字:类型 数字 | 更新日期: 2023-09-27 18:02:47
我有一个接受参数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)
{
}
}
您可以像这样使用EqualityComparer
类
if(EqualityComparer<T>.Default.Equals(value, default(T))
{
}
Stackoverflow: EqualityComparer
MSDN: EqualityComparer。默认的
既然还没有人说过,为什么不简单地利用IEquatable<T>
接口免费提供的非常直接的Equals(T other)
函数:
if (value.Equals(default(T)))
{
// ...
}
关于default
关键字的使用说明,以防OP想知道这是如何工作的:
在这里找到的文档如下(强调我的):
解决方案是使用默认关键字,它将为引用类型返回null, 为数值类型返回零。
还应该提到的是,仅仅因为您将T
限制为struct
并不意味着您可以保证T
始终是数字。例如,您的方法可以接受DateTime
作为泛型类型。也许你已经知道这一点,并且对此没有意见。
更多关于这里:什么是c#数值类型的"基类"?
您必须这样做的一个选项是使用IComparable
接口的compareTo
方法,默认类型值为…
如果它们相等,则返回0。
条件如下所示:
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)
{
}
}
如果value可以是null
,那么你必须处理它
情况如何:
private T _minimumValue = default(T)
public bool IsEqualsZero(T value)
{
return (value.CompareTo(_minimumValue) == 0);
}