收到警告 "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)事实上是正确的,虽然我不知道为什么那会是一个警告。
虽然 Customers
是 Customer
的集合,但使用 SingleOrDefault
暗示该值可能是 null
而不是 Customer
。
没有人说来自 Customers
的所有值都是非 null
.
如果将 is Customer customer
替换为 is {} customer
(需要 C# 8),警告就会消失。
JetBrainsrecommends顺便说一下这个解决方案,说它在重构代码时有一些优势。
但是,如果您发现使用确切类型的代码更具可读性,并且您希望在更改类型时让编译器失败(例如,强制审查),您可以完全禁用警告。请注意编译后的代码(IL 和 JITted)在这两种情况下都是 same。
我正在尝试在这行代码中使用新的 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)事实上是正确的,虽然我不知道为什么那会是一个警告。
虽然 Customers
是 Customer
的集合,但使用 SingleOrDefault
暗示该值可能是 null
而不是 Customer
。
没有人说来自 Customers
的所有值都是非 null
.
如果将 is Customer customer
替换为 is {} customer
(需要 C# 8),警告就会消失。
JetBrainsrecommends顺便说一下这个解决方案,说它在重构代码时有一些优势。
但是,如果您发现使用确切类型的代码更具可读性,并且您希望在更改类型时让编译器失败(例如,强制审查),您可以完全禁用警告。请注意编译后的代码(IL 和 JITted)在这两种情况下都是 same。