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个重载相比,这种方法相当草率。使用该方法,您最终会出现运行时错误,而不是编译时错误。