为什么Object.Equals的参数不是'in'(输入)?

Dmi*_*riy -1 c#

遵循(不正确/危险)代码

class EvilClass
{
    protected int x;

    public EvilClass(int x)
    {
        this.x = x;
    }

    public override bool Equals(Object obj)
    {
        if ((obj == null) || !this.GetType().Equals(obj.GetType()))
        {
            return false;
        }
        else
        {
            EvilClass p = (EvilClass)obj;
            p.x = 42;
            return (x == p.x);
        }
    }

    public override int GetHashCode()
    {
        return (x << 2);
    }

    public override string ToString()
    {
        return String.Format("EvilClass({0})", x);
    }
}

void Main()
{
    var e1 = new EvilClass(1);
    var e2 = new EvilClass(2);

    var equals = e1.Equals(e2);
    Console.WriteLine("{0}", e1.ToString());
    Console.WriteLine("{0}", e2.ToString());
}
Run Code Online (Sandbox Code Playgroud)

输出:

EvilClass(1)
EvilClass(42)
Run Code Online (Sandbox Code Playgroud)

如您所见,调用e1.Equals(e2)修改e2.如果我们编译器中标记参数将不允许我们修改它.

的Object.Equals()不要以为改变它的参数-那么,为什么参数不(输入)参数?

Kev*_*sse 6

最明显的原因是它in是在C#7.2中引入的,而object.Equals自从.net的第一个版本开始就存在.

另一个原因是它实际上不会改变任何东西.in防止改变引用,而不是实际对象.如果你试试这个:

public bool Equals2(in Object obj)
{
    if ((obj == null) || !this.GetType().Equals(obj.GetType()))
    {
        return false;
    }
    else
    {
        EvilClass p = (EvilClass)obj;
        p.x = 42;
        return (x == p.x);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后输出仍然是:

EvilClass(1)
EvilClass(42)
Run Code Online (Sandbox Code Playgroud)