1

在 Unity 中运行 c# .NET 3.5 代码会产生一个非常奇怪的问题

class X
{
    static List<X> _l = new List<X>();

    public X()
    {
        _l.Add(this);
        Debug.Log(_l.Count(x=>x==this));
    }
}

对于我创建的每个对象,计数器都会增加 1... 给出了什么?这当然是来自更大应用程序的片段,但核心问题很简单;当从构造函数添加到 List 然后从所述列表中检索自身时,无论对象是如何创建的,都应该只给出 1 个结果和 1 个结果;正确的?

如果需要更多代码,我会添加它,但我希望有人以前经历过。我不确定 Mono Unity 使用哪个版本,但我认为它是 2.0。

4

2 回答 2

3

Unity 可能会自动实现Object.Equals方法和相等运算符覆盖,这可能导致==检查不是检查引用相等,而是检查其他一些标准。

删除对MonoBehaviour(or UnityEngine.Object) 的继承,实现您自己的运算符覆盖,或将表达式更改为_l.Count(x => Object.ReferenceEquals(x, this)可以解决它。

于 2013-05-19T13:50:46.150 回答
2

我刚刚测试了您的代码,它对我来说很好(1每次创建新对象时都会打印)。

我想,就像 Chris Sinclair 在评论中所说的那样,你operator ==这样做是在覆盖或继承一个类。

您可以重新定义您的运营商:

public static bool operator ==(X @this, X other)
{
    return object.Equals(@this, other);
}
于 2013-05-19T13:50:51.180 回答