2017-08-28 72 views
0

我有一个名为Team的类。C# - 添加到HashSet时发生Stackoverflow异常<T>

class Team 
{ 
     public Team(string name) 
     { 
      this.Name = name; 
      this.Wins = 0; 
      this.Opponents = new HashSet<Team>(); 
     } 

     public string Name { get; set; } 
     public int Wins { get; set; } 
     public HashSet<Team> Opponents { get; set; } 
} 

我得到一个#1例外,每当我试图用一个单一的对手在另一支球队的HashSet的具有零名反对者guestTeam.Opponents.Add(homeTeam);

这里补充现有的团队hometeam已经在对手一个对手,而guestTeam.Opponents仍然是空的。

它是一个小测试应用程序。 堆栈跟踪的帧数又显示3

任何想法,为什么我会得到这样一个异常抛出?

+4

显示导致异常的代码。顺便说一句,如果你在'HashSet'中使用自定义类,你应该重载'Equals' +'GetHashCode'并且/或者实现'IEquatable '。 –

+0

@TimSchmelter没有必要重写'Equals + GetHashCode',如果你可以比较引用。 –

+0

@ TitianCernicova-Dragomir:true,但是因为'HashSet <>'甚至是这个类中的公共属性,所以如果他使用不同的实例,他应该知道他仍然可以添加重复的团队(f.e。same name)。这通常是不可取的。在这种情况下,它肯定是一种代码异味 –

回答

-1

我承认,我不能重现错误。我个人可以进入正确实施的

: IEquatable<Team> 

然后:

 public bool Equals(Team other) 
    { 
     if (ReferenceEquals(null, other)) return false; 
     if (ReferenceEquals(this, other)) return true; 
     return string.Equals(this.Name, other.Name) && Equals(this.Opponents, other.Opponents); 
    } 

    public override bool Equals(object obj) 
    { 
     if (ReferenceEquals(null, obj)) return false; 
     if (ReferenceEquals(this, obj)) return true; 
     if (obj.GetType() != this.GetType()) return false; 
     return Equals((Team)obj); 
    } 

    public override int GetHashCode() 
    { 
     unchecked 
     { 
      return ((this.Name != null ? this.Name.GetHashCode() : 0) * 397)^(this.Opponents != null ? this.Opponents.GetHashCode() : 0); 
     } 
    } 

    public static bool operator ==(Team left, Team right) 
    { 
     return Equals(left, right); 
    } 

    public static bool operator !=(Team left, Team right) 
    { 
     return !Equals(left, right); 
    } 

当然我不能重现,所以它刚刚拍摄。