我有这个代码,我不明白为什么如果前两行没有,最后一行会给我一个警告:

    [return: NotNull]
    public static IEnumerable<T> EmptyIfNull<T>(this IEnumerable<T>? sourceEnumerable) => sourceEnumerable ?? Array.Empty<T>();

    public static void ConfigurationSectionTest(IConfigurationSection? cfg)
    {
        IEnumerable<IConfigurationSection>? myChildren = cfg?.GetChildren();
        IEnumerable<IConfigurationSection> safeChildren = myChildren.EmptyIfNull();
        IEnumerable<IConfigurationSection> safeChildren2 = cfg?.GetChildren().EmptyIfNull(); //Warning: Converting null literal or possible null value to non-nullable type.
    }

推荐答案

查看Null-conditional operators ?. and ?[]的文档 :

空条件运算符短路.也就是说,如果条件成员或元素访问操作链中的一个操作返回null,则链的其余部分不会执行.在以下示例中,如果A判断为null,则不判断B;如果AB判断为null,则不判断C:

A?.B?.Do(C);
A?.B?[C];

因此,如果cfgnullcfg?.GetChildren().EmptyIfNull();就是null.

一种解决方法是使用括号:

// no warning
IEnumerable<IConfigurationSection> safeChildren2 = (cfg?.GetChildren()).EmptyIfNull();

Csharp相关问答推荐

c#处理大量tcp连接

使用封装的Span Range.Enumerator时引发IndexOutOfRangeResponse

WeakHandle .NET核心与.NET框架

Rx.Net -当关闭序列被触发时如何聚合消息并发出中间输出?

如何使用Automapper映射两个嵌套列表

为什么.Equals(SS,StringComparison. ClientCultureIgnoreCase)在Net 4.8和6.0之间不同?

.NET框架4.7.2项目如何引用.NET Core 2.2库?

无法从具有一对多关系的C#类中使用Swagger创建记录

如何注册接口类型,类型<>

选取器与.NET Maui MVVM的绑定属性

如何在Parall.ForEachAsync中使用CancerationTokenSource

我的MRG32k3a算法实现返回的数字超出了预期的[0,1]范围

如何在VS代码中为C#DotNet配置.json选项以调试内部终端的控制台应用程序

对于PowerShell中的ConvertTo-SecureString方法,Microsoft如何将初始化向量添加到AES加密中的安全字符串?

使用C#和.NET 7.0无法访问Cookie中的数据

如何强制新设置在Unity中工作?

使用未赋值的、传递的局部变量

为什么我的属性即使没有显式地设置任何[必需]属性,也会显示验证?

NETSDK1201:对于面向.NET 8.0和更高版本的项目,默认情况下,指定RUNTIME标识符将不再生成自包含的应用程序

反序列化我以前使用System.Text.Json序列化的文件时出现异常