遇到以下MS单元测试:
[TestMethod]
public void PersonRepository_AddressCountForSinglePerson_IsNotEqualToZero()
{
// Arrange.
Person person;
// Act.
person = personRepository.FindSingle(1);
// Assert.
Assert.AreNotEqual<int>(person.Addresses.Count, 0);
}
我在做断言时从未见过使用泛型。
这就是我写Assertion的方式:
// Assert.
Assert.AreNotEqual(person.Addresses.Count, 0);
有什么区别?
当我将鼠标悬停在我正在使用的AreNotEqual()
重载上时,该方法使用了比较两个双精度的重载(不确定为什么没有int,int重载)。
如果我做将<int>
的泛型类型参数放入,ReSharper说这是多余的。
所以我的问题是:如果我这样做仍然是类型安全的,为什么要使用泛型断言?
答案 0 :(得分:5)
所以我的问题是 - 如果我这样做仍然是类型安全的,为什么要使用泛型断言?
您现在正在使用通用断言。编译器会看到泛型方法,并在编译时选择它。这就是Resharper说<int>
是多余的原因 - 这不是因为该方法是多余的,而是编译器可以隐式确定Assert.AreNotEqual<int>
方法是正确使用的方法。
通常,您通常不需要在泛型上指定类型。这就是使LINQ语法可以忍受的原因 - 没有它,你需要在链中的每个方法调用上指定类型,并且匿名类型将是不可用的。
话虽如此,有时需要指定泛型类型。这主要是因为编译器无法自动确定类型,例如参数列表中没有匹配参数(即:Foo.Create<MyClass>()
),或者由于某些其他原因无法确定类型。