C# 为什么要使用空原谅运算符?

C# 为什么要使用空原谅运算符?,c#,.net-core,C#,.net Core,Net Core 3.0的System.Array类中有FindIndex方法。我不明白为什么要使用如果匹配参数没有?运算符,并且我们没有收到编译器警告 公共静态int-FindIndex(T[]数组,int-startIndex,int-count,谓词匹配) { // ... // if(match==null) { ThrowHelper.ThrowArgumentNullException(argument.match除外); } int-endIndex=startIndex+coun

Net Core 3.0的System.Array类中有FindIndex方法。我不明白为什么要使用
如果
匹配
参数没有
运算符,并且我们没有收到编译器警告

公共静态int-FindIndex(T[]数组,int-startIndex,int-count,谓词匹配)
{
//
...
//
if(match==null)
{
ThrowHelper.ThrowArgumentNullException(argument.match除外);
}
int-endIndex=startIndex+count;
对于(int i=startIndex;i如果(match!(array[i])您将在最新的源代码中看不到此运算符,但是如果您尝试在github页面上检查git Gurus,您可以看到小注释:

//TODO-NULLABLE:删除!当[DoesNotReturn]受尊重时

然后,如果您仔细查看此代码:

if (match == null)
{
    ThrowHelper.ThrowArgumentNullException(ExceptionArgument.match);
}
并将其与:

if (match == null)
{
    throw new ArgumentNullException(nameof(match));
}

您可以看到它检查
null
,然后抛出一个异常(它是由helper方法
ThrowHelper.ThrowArgumentNullException
完成的),但编译器不知道当
match
null
时,此方法将“中断”执行
FindIndex
方法(因为
[DoesNotReturn]
属性尚未实现)。因此,编译器将生成一个错误,因为它会认为
匹配
仍然可以是
null
,我们需要强制编译器忽略它。稍后,该属性被实现,并且
运算符被删除。()

最新的资料显示这里没有
运算符Null原谅运算符在这里没有意义,因为您正在提前检查
匹配
Null
谢谢您的回答,但是编译器为什么会生成错误?
匹配
参数没有
operator@EvgeniyTerekhin 请查看@EvgeniyTerekhin,因为我们检查
null
,编译器知道它已经为null,并显示警告(不是错误I是错误的,但可能corefx威胁警告为错误),然后我们尝试访问null对象(它不明白helper方法将引发异常,并且永远不会返回结果)非常感谢。我试过这个案子,很可能是疏忽大意。根据你的要点,我得到了警告。)