Assert.IsNotNull()应该将参数约束到类

时间:2015-09-14 00:43:19

标签: c# value-type boxing reference-type

为什么Microsoft.VisualStudio.TestTools.UnitTesting.Assert.IsNotNull() 声明为:

public static void IsNotNull(Object value)

而不是:

public static void IsNotNull<T>(T value) where T : class

我只是认为一些经验不足的开发人员会传递一个值类型,认为如果值为0,它将抛出异常。

更新: 有没有办法将参数约束到C#1.0中的引用类型?

3 个答案:

答案 0 :(得分:2)

如果有一个代码可以在不同情况下产生不可为空的值类型以及可空值类型和引用类型中的一个或两个,该怎么办?

除了没有一种很好的方法来覆盖约束中的引用类型和可空值类型之外,我刚刚描述的代码类型在不应该导致null的情况下不再可测试。 (例如Enumerable.Max()可以返回所有这些类型,但如果序列中至少有一个非空值,则必须永远不返回null,如果类型可以为null且序列为空,则必须返回null。

如果您可以证明所有此类用途也是错误的,那么减少功能以避免误用是有价值的。这不仅不能被证明是真实的,而且可以证明是错误的。

答案 1 :(得分:0)

正如我在评论中所说,回答&#34;为什么&#34;是因为在编写Assert.IsNotNull时,C#1.0中没有泛型。改变它,虽然可能(更)更正确,但有可能破坏现有代码。无论好坏,微软都非常重视保持现有代码的正常运行。

答案 2 :(得分:-2)

因为函数的目的是断言value != nullnull是一个独立于任何类型参数的值,所以添加一个类型参数将是毫无意义的开销。