【问题标题】:Possible null reference assignment warning seems bogus to me可能的空引用分配警告对我来说似乎是假的
【发布时间】:2021-08-23 21:08:33
【问题描述】:

下面的代码给了我一个警告,但我不明白为什么。

client.Host = Settings.Host;

警告 CS8601:可能的空引用分配。

clientSettings 在这里都不为空。 client.HostSettings.Host 都是 string? 类型。

因此,虽然它可能是一个可能的 null 引用赋值,但这并不重要,因为目标变量允许为 null。

【问题讨论】:

  • 虽然SmtpClient.Host 确实是一个可为空的字符串,但使用setter 将其设置为null 将抛出ArgumentNullException。请参阅来源here。编译器可能只是巧妙地推断出这一点(它具有DisallowNull 属性)。
  • @sellotape:这是一个非常具体的警告,我不认为这是考虑到 setter 可能抛出异常的事实。但是,该属性标有[DisallowNull] 的事实几乎可以肯定是问题所在。即使数据类型允许,编译器也会看到此属性并警告潜在的空值。

标签: c# .net-5 nullable nullable-reference-types


【解决方案1】:

注意Host 属性声明上的DisallowNull 属性。

来自documentation

指定不允许 null 作为输入,即使 对应的类型允许。

[DisallowNull]
public string? Host

由于它是在System.Diagnostics.CodeAnalysis 命名空间中声明的,Visual Studios 代码分析器会考虑到这一点。

【讨论】:

  • 可惜没看源码就看不到这个。事实上,Intellisense 明确表示它可以为 null。
【解决方案2】:

您可以使用 AllowNullAttribute 类:

指定允许 null 作为输入,即使相应的类型不允许它。

例如:

[AllowNullAttribute]
public string Host

这样你就不会收到那些烦人的警告了!

【讨论】:

    【解决方案3】:

    字符串?已声明,智能在某些情况下肯定会将其变为可空值。

    【讨论】:

      猜你喜欢
      • 2020-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-19
      • 1970-01-01
      • 2020-07-05
      • 2020-06-24
      相关资源
      最近更新 更多