繁体   English   中英

由于对象的当前状态,IEquatable Operation无效

[英]IEquatable Operation is not valid due to the current state of the object

广告我正在用C#开发一个项目我最近遇到了一个我无法理解的错误。

首先,这是核心

if (CanPlay(target.Coord.X, target.Coord.Y))
{
    target.Owner = m.Player;
    this.MoveList.Push(m);
    // Groupes
    var friends = GetAround(target).FindAll(i => i.Owner == target.Owner);

    Groupe g = new Groupe { target };
    foreach (Intersection fr in friends)
    {
        g.AddRange(GetGroupe(fr));
    }
    foreach (Intersection fr in friends)
    {
        this.Groupes.Remove(GetGroupe(fr));
    }
    this.Groupes.Add(g);
}

以下是导致问题的getGroupe函数:

Groupe GetGroupe(Intersection i)
{
    return this.Groupes.First(g => g.Contains(i));
}

因此,在某些随机时刻,当移动完成时,由于对象的当前状态,我得到IEquatable操作无效。 这是堆栈跟踪:

InvalidOperationException: Operation is not valid due to the current state of the object
System.Linq.Enumerable.First[Groupe] (IEnumerable`1 source, System.Func`2 predicate, Fallback fallback)

System.Linq.Enumerable.First[Groupe] (IEnumerable`1 source, System.Func`2 predicate)

Assets.ObjetsDeJeu.Goban.GetGroupe (Assets.ObjetsDeJeu.Intersection i) (at Assets/ObjetsDeJeu/Goban.cs:155)
Assets.ObjetsDeJeu.Goban.PutRock (Assets.ObjetsDeJeu.Move m) (at Assets/ObjetsDeJeu/Goban.cs:142)

因此,线142是

g.AddRange(GetGroupe(fr)); 

和155是

return this.Groupes.First(g => g.Contains(i));

我不明白,因为这个.Groupes只是空洞的。 我做了一个测试,我在查找一个组之前检查了它是否为空,但它没有改变任何东西......

问题是使用指定的谓词调用First()不会产生任何结果。 请改用FirstOrDefault并检查null
按如下所示更改代码以解决问题:

foreach (Intersection fr in friends)
{
    var group = GetGroupe(fr);
    if(group != null)
       g.AddRange(group);
}
foreach (Intersection fr in friends)
{
   var group = GetGroupe(fr);
   if(group != null)
     this.Groupes.Remove(group);
}


Groupe GetGroupe(Intersection i)
{
   return this.Groupes.FirstOrDefault(g => g.Contains(i));
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM