C# 为什么要使用空原谅运算符?
Net Core 3.0的System.Array类中有FindIndex方法。我不明白为什么要使用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
如果匹配
参数没有?
运算符,并且我们没有收到编译器警告
公共静态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方法将引发异常,并且永远不会返回结果)非常感谢。我试过这个案子,很可能是疏忽大意。根据你的要点,我得到了警告。)