C# int 相等运算符意外为 false

Ran*_*all 1 c# .net-6.0

这是一个更广泛的问题,以我的具体例子为例。到此为止的代码相当复杂,所以我希望这已经足够了。

C#中什么情况下两个相同的int不相等?

1005 == 1005 //false
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

在此输入图像描述

specConversion首先作为传递的 string ,其中确定(类的属性)spec的类型,然后将其转换为该类型。这似乎按预期工作,因为此时两个变量具有相同的类型。我不确定其中任何一个是否与最初的问题相关:为什么这两个 int 值不相等?yspecspecConversion

Joh*_* Wu 8

当调试器显示以下内容时:

object {int}
Run Code Online (Sandbox Code Playgroud)

这意味着它是一个装箱的int 。装箱值类型是object(具体来说,System.ValueType),它是引用类型。每次装箱都会产生一个新的对象实例,这意味着它们不会具有引用相等性,即使它们装箱了相同的值。对于引用类型,该==运算符测试引用相等性,因此在这种情况下它将返回 false。

如果您想要值相等而不是引用相等,请使用Equals.

public class Program
{
    public static void Main()
    {
        object a = 1;
        object b = 1;

        Console.WriteLine(a == b);
        Console.WriteLine(a.Equals(b));
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

False
True
Run Code Online (Sandbox Code Playgroud)

https://dotnetfiddle.net/eSuFVL

另一个解决方案是将您的int值存储在实际int变量而不是对象中,例如使用泛型

  • +1。可能值得指出的是,调试器仅在装箱场景中才会显示“object {int}”。(或者一些奇怪的`.ToString`覆盖) (2认同)