原因很简单,struct是结构体,我们都知道结构体是值类型的,而你给的值正好是一样的,所以移除了s2实际就是把s1给移除了。你把struct换成class,看看运行的结果。

解决方案 »

  1.   


    类不会发生这种情况
    能说具体点不,谢谢(小弟是刚接触C#一段时间)
    类似于 值类型和引用类型的区别
    你用class的话,就算数据是一样的,但是对象的引用、内存的引用是不一样的,所以不会发生这种情况。
    以上是我的一些粗浅的理解,如有错误,请大神们指教。
      

  2.   

    结构体不能直接调用Move,否则按照值去匹配。
      

  3.   

    结构体不能直接调用Remove,否则按照值去匹配。
      

  4.   

    public virtual void Remove(object obj)
    {
        int index = this.IndexOf(obj);
        if (index >= 0)
        {
            this.RemoveAt(index);
        }
    }
    这个是Remove内部实现
    如果你调用的是结果体,那么就会按值的匹配
    也就是说,你已添加了一个s1,在调用Remove(s2)的时候你会发现,返回的是s1的索引(也就是index=0)
    然后在看Remove()内部的判断,最终会调用Removeat(index)方法进行移除
    public virtual void RemoveAt(int index)
    {
        if ((index < 0) || (index >= this._size))
        {
            throw new ArgumentOutOfRangeException("index", Environment.GetResourceString("ArgumentOutOfRange_Index"));
        }
        this._size--;//0
        if (index < this._size)
        {
            Array.Copy(this._items, index + 1, this._items, index, this._size - index);
        }
        this._items[this._size] = null;//将第一个this._size-1的项设为null
        this._version++;
    }