为什么要使用零容忍运算符?

时间:2019-12-25 10:32:34

标签: c# .net-core

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;
        }

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完成的),但是编译器并不知道此方法会“中断” { FindIndexmatch时的{1}}方法(因为尚未实现null属性)。因此,编译器将生成错误,因为它将认为[DoesNotReturn]仍然可以是match,因此我们需要强制编译器忽略它。后来,实现了该属性,并删除了null运算符。 (Source code of helper method