2014-02-27 8 views
1

광고 C에서 프로젝트 개발 중입니다. 최근에 오류가 발생하여 이해할 수 없습니다. 모두 여기의IEquatable 현재 상태로 인해 작업이 올바르지 않습니다.

먼저 핵심

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

그래서, 이동이 완료 어떤 임의의 순간에, I IEquatable Operation가 객체의 현재 상태로 인해 유효하지 않습니다. 그래서 라인 (142)

g.AddRange(GetGroupe(fr)); 

155은 this.Groupes 이후

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

이해가 안가에서만 빈입니다

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) 

입니다

: 여기 는 스택 추적입니다 아주 begenning. 그룹을 찾기 전에 비어 있는지 확인했지만 아무 것도 변경하지 않은 테스트를 수행했습니다 ...

+0

'Groupe' 및'Intersection'의 정의를 입력하십시오. –

답변

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