1

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));

this.Groupes は最初は空なのでわかりません。グループを探す前に空かどうかを確認するテストを行いましたが、何も変わりませんでした...

4

1 に答える 1

3

問題は、指定された述語を使用して を呼び出して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));
}
于 2014-02-27T09:25:06.040 に答える