通用数字类型

时间:2015-07-15 17:14:06

标签: c#

我有一个接受参数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)
        {

        }

    }

4 个答案:

答案 0 :(得分:5)

您可以像这样使用EqualityComparer

if(EqualityComparer<T>.Default.Equals(value, default(T))
{
}

Stackoverflow:EqualityComparer<T>.Default vs. T.Equals

MSDN:EqualityComparer.Default

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

正如This Answer

中所述

答案 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?