Assert.IsNotNull() 应将参数限制为 class
Assert.IsNotNull() should constrain parameter to class
为什么是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 中将参数限制为引用类型?
因为函数的目的是断言value != null
,而null
是一个独立于任何类型参数的值,所以添加类型参数是没有意义的开销。
正如我在评论中所说,"why" 的答案是因为在编写 Assert.IsNotNull
时泛型在 C# 1.0 中不可用。更改它虽然可以说(更)正确,但有可能破坏现有代码。无论好坏,Microsoft 都非常重视保持现有代码正常工作。
如果有代码可以在不同情况下生成不可为 null 的值类型以及可空值类型和引用类型中的一种或两种?
除了在约束中没有涵盖引用类型和可为空值类型的好方法之外,我刚才描述的那种代码在不应导致 null 的情况下不再可测试。 (例如,Enumerable.Max()
可以 return 所有这些类型,但如果序列中至少有一个非空值,则绝不能 return null,如果类型可以为 null,序列为空)。
减少功能以避免错误使用只有在您可以证明所有此类使用也是错误的情况下才有价值。在这里不仅不能证明是真的,而且可以证明是假的。
为什么是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 中将参数限制为引用类型?
因为函数的目的是断言value != null
,而null
是一个独立于任何类型参数的值,所以添加类型参数是没有意义的开销。
正如我在评论中所说,"why" 的答案是因为在编写 Assert.IsNotNull
时泛型在 C# 1.0 中不可用。更改它虽然可以说(更)正确,但有可能破坏现有代码。无论好坏,Microsoft 都非常重视保持现有代码正常工作。
如果有代码可以在不同情况下生成不可为 null 的值类型以及可空值类型和引用类型中的一种或两种?
除了在约束中没有涵盖引用类型和可为空值类型的好方法之外,我刚才描述的那种代码在不应导致 null 的情况下不再可测试。 (例如,Enumerable.Max()
可以 return 所有这些类型,但如果序列中至少有一个非空值,则绝不能 return null,如果类型可以为 null,序列为空)。
减少功能以避免错误使用只有在您可以证明所有此类使用也是错误的情况下才有价值。在这里不仅不能证明是真的,而且可以证明是假的。