通用数字类型

本文关键字:类型 数字 | 更新日期: 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。Default与T.Equals

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);
}