【问题标题】:Nullable reference types on object array对象数组上的可空引用类型
【发布时间】:2022-01-13 22:46:10
【问题描述】:

我有一个具有不可为空引用类型的 .NET 6 项目。

我想将 objects 参数限制为可空对象的不可空数组。

我有 4 种可能的方法,并假设其中一种应该有效。

public void Method1(object[] objects)

public void Method2(object[]? objects)

public void Method3(object?[] objects)

public void Method4(object?[]? objects)

Method2 和 4 都接受空值。所以我只剩下 1 和 3,但我都收到了警告:

CS8625 无法将 null 文字转换为不可为 null 的引用类型

我希望方法 3 在没有警告的情况下工作:

Method3(new object[] { null });

有什么办法可以完成吗?

我的问题已在其中一个 cmets 中得到解答。我当然应该使用:

 Method3(new object?[] { null });

【问题讨论】:

  • 错误来自于参数的声明,而不是方法的定义。
  • new object?[] { null }
  • 看起来像错字 - new object[] { null } 不是 object?[] objects... 除非它是确切的问题 - 但为什么你期望 null 满足不可为空object?
  • 我错过了什么吗? public void Method3(object?[] objects) 应该怎么做? (我的 IDE 没有给出“CS8625 Cannot convert null literal to non-nullable reference type”警告)

标签: c# nullable-reference-types


【解决方案1】:

这个答案只是为了完整,所以答案不仅仅在cmets中

问题不在于方法的声明及其参数,而在于调用。您正在创建一组不可为空的对象并使用一个 null 对其进行初始化。您应该改为创建一个可以为空的对象数组,如下所示:new object?[] { null }

回答您对方法声明的困惑:

可空性运算符始终引用前一个类型。

所以在object[]? 中,可空性运算符仅适用于数组。这意味着null 和一个不可为空的对象数组将适合这种类型。

当您编写object?[] 时,可空性运算符仅适用于object。这意味着可空对象的不可空数组与此类型匹配。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-27
    • 1970-01-01
    • 2019-04-07
    • 2011-03-10
    • 2012-08-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-05
    相关资源
    最近更新 更多