这两项职能都产生了相同的国际空间法研究所;
bool Test1<T>(T val) => val == null;
bool Test2<T>(T val) where T:class => val == null;
IL_0000: ldarg.0
IL_0001: box !!T
IL_0006: ldnull
IL_0007: ceq
IL_0009: ret
1. 如果电离层穿透面值;
Test1<int>(0) == false;
然后,在标的中将打上ger子,这总是会导致非核参考。 因此,与<代码>null的比较总是虚假的。
通过<代码>Nullable<T>的论点也属于罚款,结果与IL。
bool Test3<T>(T? val) where T:struct => val == null;
bool Test4<T>(T? val) where T:struct => !val.HasValue;
IL_0000: ldarga.s val
IL_0002: call instance bool valuetype [System.Runtime]System.Nullable`1<!!T>::get_HasValue()
IL_0007: ldc.i4.0
IL_0008: ceq
IL_000a: ret
但是,没有违约的<代码>= 价值类型操作者;
bool Test5<T>(T val) where T:struct => val == null;
bool Test6<T>(T val) where T:struct => val == default(T);
error CS0019: Operator == cannot be applied to operands of type T and <null>
error CS0019: Operator == cannot be applied to operands of type T and T
相反,你可以使用缺省比较器;
public bool Test7<T>(T val) => EqualityComparer<T>.Default.Equals(val, default(T));
自2008年起 7 您可以添加一个制约因素,由数字类型加以实施;
public bool Test8<T>(T val) where T : IEqualityOperators<T,T,bool> => val == default(T);