我有一个 C # 字符串扩展方法,它应该返回一个字符串中子字符串的所有索引的 IEnumerable<int>
。它完美地达到了预期的目的,并且返回了预期的结果(我的一个测试已经证明了这一点,尽管下面的测试没有) ,但是另一个单元测试发现了它的一个问题: 它不能处理 null 参数。
下面是我正在测试的扩展方法:
public static IEnumerable<int> AllIndexesOf(this string str, string searchText)
{
if (searchText == null)
{
throw new ArgumentNullException("searchText");
}
for (int index = 0; ; index += searchText.Length)
{
index = str.IndexOf(searchText, index);
if (index == -1)
break;
yield return index;
}
}
下面是提出这个问题的测试:
[TestMethod]
[ExpectedException(typeof(ArgumentNullException))]
public void Extensions_AllIndexesOf_HandlesNullArguments()
{
string test = "a.b.c.d.e";
test.AllIndexesOf(null);
}
When the test runs against my extension method, it fails, with the standard error message that the method "did not throw an exception".
这是令人困惑的: 我已经清楚地将 null
传递给函数,但由于某种原因,比较 null == null
返回的是 false
。因此,不会引发异常并继续执行代码。
我已经通过测试证实了这不是一个 bug: 当在我的主项目中运行这个方法时,在 null 比较 if
块中调用 Console.WriteLine
时,控制台上没有显示任何东西,我添加的任何 catch
块也不会捕获任何异常。此外,使用 string.IsNullOrEmpty
而不是 == null
也存在同样的问题。
为什么这个看似简单的比较会失败呢?