Net Core 3.0的System.Array类中有FindIndex方法。我不明白为什么如果!
参数没有match
运算符并且我们没有得到编译器警告,为什么要使用?
?
public static int FindIndex<T>(T[] array, int startIndex, int count, Predicate<T> match)
{
//
...
//
if (match == null)
{
ThrowHelper.ThrowArgumentNullException(ExceptionArgument.match);
}
int endIndex = startIndex + count;
for (int i = startIndex; i < endIndex; i++)
{
if (match!(array[i])) <---
return i;
}
return -1;
}
答案 0 :(得分:2)
您不会在最新的源代码中看到此运算符,但是如果您尝试在github页面上检查git blame,您会看到一些小注释:Array.cs
// TODO-NULLABLE:删除!尊重[DoesNotReturn]
然后,如果您仔细看一下这段代码:
if (match == null)
{
ThrowHelper.ThrowArgumentNullException(ExceptionArgument.match);
}
并将其与以下内容进行比较:
if (match == null)
{
throw new ArgumentNullException(nameof(match));
}
您可以看到它先检查null
然后抛出异常(这是通过辅助方法ThrowHelper.ThrowArgumentNullException
完成的),但是编译器并不知道此方法会“中断” { FindIndex
为match
时的{1}}方法(因为尚未实现null
属性)。因此,编译器将生成错误,因为它将认为[DoesNotReturn]
仍然可以是match
,因此我们需要强制编译器忽略它。后来,实现了该属性,并删除了null
运算符。 (Source code of helper method)