C# 泛型数字类型

C# 泛型数字类型,c#,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&g

我有一个扩展方法,它接受一个参数
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)
        {

        }

    }
public static void WriteFlaggedValue(此输出包输出包,uint标志,T值,ref-uint输出标志),其中T:struct,
我可比,
我可比,
i可转换,
合理的,
可攻击的
{
如果(值==0)
{
}
}

您可以像这样使用
EqualityComparer

if(EqualityComparer<T>.Default.Equals(value, default(T))
{
}
if(EqualityComparer.Default.Equals(值,默认值(T))
{
}
堆栈溢出:


MSDN:

您必须执行此操作的一个选项是使用
IComparable
接口的
compareTo
方法,使用

如果它们相等,它将返回零

情况如下所示:

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)
        {

        }

    }
public static void WriteFlaggedValue(此输出包输出包,uint标志,T值,ref-uint输出标志),其中T:struct,
我可比,
我可比,
i可转换,
合理的,
可攻击的
{
if(value.CompareTo(默认值(T))==0)
{
}
}
如果值可以为空,则必须处理它。

如何:

private T _minimumValue = default(T)

public bool IsEqualsZero(T value) 
{
    return (value.CompareTo(_minimumValue) == 0);
}

正如

中所建议的,既然还没有人说过,为什么不简单地利用
IEquatable
界面免费提供的非常直接的
Equals(T other)
功能:

if (value.Equals(default(T)))
{
    // ...
}

关于在case OP中使用
default
关键字的说明想知道这是如何工作的:

发现的文件如下(强调我的):

解决方案是使用默认关键字,它将为引用类型返回null,为数值类型返回零


还应该提到的是,仅仅因为您将
T
限制为
struct
,并不意味着您可以保证
T
始终是数字的。例如,您的方法可以接受
DateTime
作为泛型类型。也许您已经知道这一点,并对此表示同意


关于这方面的更多信息:

您似乎需要检查。我不认为有任何内置支持强制T为数字,这可能是一个坏主意。但是,如果(value==(T)0),您就不能执行
if(value==(T)0)
?如果您只有4种可能的类型,我可能会建议只为其中的每种类型创建一个重载。您应该如何强制执行
T
byte、short、int和long
?泛型似乎不是正确的方法。也许重载更适合您可以使用typeof()检查数值类型。如果不是您想要的,则抛出异常。@tdbeckett虽然这是真的,但我仍然认为与4个重载相比,这种方法相当草率。使用该方法,您最终会出现运行时错误,而不是编译时错误。