列表中的所有引用都指向'this'

时间:2013-05-19 13:40:43

标签: c# .net mono unity3d

在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。

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

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

我想,就像Chris Sinclair在评论中所说的那样,你正在重写operator ==或继承一个类。

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

public static bool operator ==(X @this, X other)
{
    return object.Equals(@this, other);
}