は、以下のテストが予期せず失敗します。IEnumerable <T>を扱う場合、NUnit Assert.AreNotEqualの動作が正しくありませんか? NUnitの2.5.9使用
[TestFixture]
public class FooTest
{
[Test]
public void Inequality()
{
var first = new Foo(new[] { 1 }, 2);
var second = new Foo(new[] { 1 }, 3);
Assert.AreNotEqual(first, second);
}
}
public struct Foo : IEnumerable<int>, IEquatable<Foo>
{
private readonly IEnumerable<int> values;
public int Bar { get; private set; }
public Foo(IEnumerable<int> values, int bar)
: this()
{
this.values = values;
Bar = bar;
}
public IEnumerator<int> GetEnumerator()
{
return values.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
public bool Equals(Foo other)
{
return other.values.SequenceEqual(values) && other.Bar == Bar;
}
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj))
{
return false;
}
if (obj.GetType() != typeof(Foo))
{
return false;
}
return Equals((Foo)obj);
}
public override int GetHashCode()
{
unchecked
{
return ((values != null ? values.GetHashCode() : 0) * 397)^Bar;
}
}
public static bool operator ==(Foo left, Foo right)
{
return left.Equals(right);
}
public static bool operator !=(Foo left, Foo right)
{
return !left.Equals(right);
}
}
NUnitのコードに掘り、それはNUnitのは、IEnumerableを実装する2つのオブジェクトに遭遇した場合、それだけで2つのコレクションを比較し、他を無視することが判明しますオブジェクトのプロパティ。
これは私にとって間違っています。オブジェクトが特定のインターフェイスを実装していても、その役割を果たすだけに限定されるわけではありません。または、.NETのIEnumerableインターフェイスが特別なケースですか?または私はちょうどNUnitを誤解している?
+1興味深い質問の情報のため – sll