为什么T不能是一个字节[]? 请参阅https://msdn.microsoft.com/de-de/library/ms243446.aspx
上的说明 byte[] one = { 0x1, 0x2, 0x3, 0x4, 0x5 };
byte[] two = { 0x1, 0x2, 0x3, 0x4, 0x5 };
//don't fail
Assert.AreEqual(Convert.ToBase64String(one), Convert.ToBase64String(two));
//fail
Assert.AreEqual<byte[]>(one, two);
答案 0 :(得分:14)
您正在比较一个字节数组具有引用相等性与另一个字节数组(即两个变量指向同一个数组),在这种情况下它们不会。
更好的方法是使用SequenceEqual进行测试:
Assert.IsTrue(one.SequenceEqual(two));
答案 1 :(得分:2)
那么,
Assert.AreEqual<T>(one, two);
在比较时使用T.Equals()
。因为数组不会覆盖 Equals
byte[] one = { 0x1, 0x2, 0x3, 0x4, 0x5 };
byte[] two = { 0x1, 0x2, 0x3, 0x4, 0x5 };
if (one.Equals(two))
Console.Write("Yes");
else
Console.Write("No"); // <- you'll have this
你会有意想不到的结果。如果Equals
未被覆盖,则Object.Equals
会比较引用,而不是值,而one
和two
的引用是不同。如果你想要比较数组&#39;项目,请使用SequenceEqual
答案 2 :(得分:0)
要回答标题中的问题,请执行以下操作:
Assert.AreEqual<byte[]>(one, two);
请参考比较,因为您正在比较两个数组。
要比较内容,请执行@RB。提到并使用SequenceEqual
。