C# 不可为空的字符串类型,如何与Asp.Net核心选项一起使用

C# 不可为空的字符串类型,如何与Asp.Net核心选项一起使用,c#,asp.net-core,c#-8.0,nullable-reference-types,C#,Asp.net Core,C# 8.0,Nullable Reference Types,她说 我的目的是表示,MyJwtOptions中的属性Issuer和Audience从不为空。这对于消费者来说是非常合理的选择,不是吗?这些非空值由下面描述的Asp.Net核心验证来确保 但是如果JwtOptions没有构造函数初始化所有属性,那么C#8编译器会报告 警告CS8618不可为空的属性“Issuer”未初始化 由于某些技术原因,Asp.Net核心选项不能有带参数的构造函数。所以我坚持我的意图。我可以关闭nullable checking或声明Issuer和其他属性为nullable,

她说

我的目的是表示,My
JwtOptions
中的属性
Issuer
Audience
从不为空。这对于消费者来说是非常合理的选择,不是吗?这些非空值由下面描述的Asp.Net核心验证来确保

但是如果
JwtOptions
没有构造函数初始化所有属性,那么C#8编译器会报告

警告CS8618不可为空的属性“Issuer”未初始化

由于某些技术原因,Asp.Net核心选项不能有带参数的构造函数。所以我坚持我的意图。我可以关闭nullable checking或声明
Issuer
和其他属性为nullable,但我认为这不是最好的解决方案

在这种情况下有什么优雅的解决方案吗

csproj中的代码片段:

<PropertyGroup>
  <TargetFramework>netcoreapp2.2</TargetFramework>
  <AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>
  <LangVersion>8.0</LangVersion>
  <Nullable>enable</Nullable>
</PropertyGroup>
选项由Startup.cs中的下一个代码配置:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();

        services.AddOptions<JwtOptions>()
            .Bind(Configuration.GetSection("JwtOption"))
            .ValidateDataAnnotations();
    }

如您所见,对于消费者而言,或
受众
发行人
都不能为空。将这些属性设为null毫无意义。

据编译器所知,它尚未初始化,可以是
null
。使用
!(null原谅运算符)
作为最后手段(并留下注释解释为什么使用

// This should be set by the options binding
public string Issuer { get; set; } = null!; 

谢谢,这是一种快速而肮脏的解决方案,正如你所看到的,注释是为了清晰…不是很优雅。我不知道是否可以做得更好?@KarelKral我不这么认为。这是mads和bill在NDC会谈中建议的模式。谢谢,我不知道。显然,不可为null的引用类型带来了很多挑战@这是一个全新的世界,但利大于弊
    public HomeController(IOptions<JwtOptions> options)
    {
        string audience = options.Value.Audience;
        string issuer = options.Value.Issuer;
    }
// This should be set by the options binding
public string Issuer { get; set; } = null!;