收到警告 "The source expression is always of pattern's type, matches on all non-null values"

Getting warning "The source expression is always of pattern's type, matches on all non-null values"

我正在尝试在这行代码中使用新的 C# 7 模式匹配功能

if (Customers.SingleOrDefault(x => x.Type == CustomerType.Company) is Customer customer)
{
    ...
}

但出于某种原因 Resharper/Visual Studio 2017 在 is Customer 下给我一个警告,其中包含以下消息

The source expression is always of pattern's type, matches on all non-null values

但是customer也可以是null对吧?任何人都可以向我解释为什么会发出此警告吗?

你说得对!

ReSharper(不是 Visual Studio)事实上是正确的,虽然我不知道为什么那会是一个警告。

虽然 CustomersCustomer 的集合,但使用 SingleOrDefault 暗示该值可能是 null 而不是 Customer

没有人说来自 Customers 的所有值都是非 null.

如果将 is Customer customer 替换为 is {} customer(需要 C# 8),警告就会消失。

JetBrainsrecommends顺便说一下这个解决方案,说它在重构代码时有一些优势。

但是,如果您发现使用确切类型的代码更具可读性,并且您希望在更改类型时让编译器失败(例如,强制审查),您可以完全禁用警告。请注意编译后的代码(IL 和 JITted)在这两种情况下都是 same