c# – Null Check运算符仍然返回空值

我正在尝试从我的依赖注入器获取实现类型的所有通用服务

protected List<ServiceDescriptor> GetGenericServicesFromGenericTypeDefinition(IServiceCollection services, Type baseGenericTypeDefinition)
{
    if(false == baseGenericTypeDefinition.IsGenericTypeDefinition)
    {
        throw new Exception($"Invalid Argument {nameof(baseGenericTypeDefinition)}");
    }

    //TODO:  check the base type recursively
    var genericImplementations = services.Where(s => s?.ImplementationType.GetTypeInfo().IsGenericType ?? false)
            .ToList();
    //.... Omitted unrelated to issue
}

奇怪的是,当它试图创建genericImplementations List时,我收到一个错误

System.ArgumentNullException: ‘Value cannot be null.’

我检查了它不是null的服务,但是实现类型.这怎么可能,这有些与func如何构建有关?
c# –  Null Check运算符仍然返回空值

编辑
我如何使用Elvis运算符错误?你可以看到s有一个值.从图片.错误是从检查的类型生成的,这怎么可能?

解决方法:

?. operator仅指它应用的解除引用操作.当不仅s可以为null,而且s.ImplementationType,表达式……

s?.ImplementationType.GetTypeInfo()

……还不够.您需要在左侧表达式为null的所有位置使用运算符:

s?.ImplementationType?.GetTypeInfo()

由于GetTypeInfo()的返回不能为null,因此写入:

s?.ImplementationType?.GetTypeInfo().IsGenericType ?? false

不通常应用?是一个好主意.对所有解除引用,但仅在值可以为null并且跳过表达式的其余部分时才使用它是正常的.如果您通常在所有情况下都应用运算符,则可能会出现错误,否则会很早发现错误.

上一篇:ASP.NET Core SignalR:基础概述


下一篇:.net core 3.0 Signalr - 04 使用Redis做底板来支持横向扩展