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

本文关键字:约束 参数 IsNotNull Assert | 更新日期: 2023-09-27 18:12:31

为什么是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中是否有方法将参数约束为引用类型?

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

正如我在评论中所说,"为什么"的答案是因为在编写Assert.IsNotNull时,c# 1.0中还没有泛型。更改它,虽然可以证明(更)正确,但有可能破坏现有代码。不管是好是坏,微软都非常重视保持现有代码的工作。

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

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

减少功能以避免错误使用只有在您可以证明所有这些使用也是错误的情况下才有价值。在这里,它不仅不能被证明是真的,而且可以被证明是假的。

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