我正在编写一个基本模型验证器,它使用带有自定义“必需”属性的反射。当模型传递到验证器方法时,将检查所有属性是否包含此必需属性。复杂类型也会被递归验证。当找到具有此属性的属性时,如果它是可为 null 的类型,它将将该值与 null 进行比较,否则它将与默认值进行比较。
我在将不可空类型与默认类型进行比较时遇到问题。对于 int 类型,以下条件的计算结果为 false,但它应该为 true:
if (prop.GetValue(testObject) == default)
{
Console.WriteLine($"{VALIDATION_FAILED_MESSAGE}: {baseObjectName}{testObject.GetType().Name}.{prop.Name} is null.");
isNullorDefault = true;
}
Run Code Online (Sandbox Code Playgroud)
我在调试器中看到,所比较的值无疑是默认值 -> default(int) == 0,但它的计算结果为 false。为什么?
好吧,这里有一些事实:
\nGetValue返回 an object,它是一个引用类型==on 对象进行引用比较(如果两者是同一个对象,则如此)。object。default没有类型只是根据上下文推断出来的,这里是 xc2xa0 object,所以null.因此,此比较永远不会计算为 true:装箱值类型 never null,即使您这样做GetValue(x) == (object)0,它仍然是 false,因为它0会被装箱到不同的对象,因此,不同的引用进行不同的比较。
这就是你对为什么会发生这种情况的回答。有关您正在尝试执行的实际操作的解决方案,请参阅此问题。
\n