如何使C#类的Object属性可选?

问题描述 投票:-2回答:3

我正在尝试在C#中创建一个模型类,在其中我需要对象/列表属性作为可选属性:

public class Customer
{
        [JsonProperty("Custid")]
        public string CustId { get; set; }
        [JsonProperty("CustName")]
        public string CustName { get; set; }
}
public class Store
{
        [JsonProperty("id")]
        public string Id { get; set; }
        [JsonProperty("Name")]
        public string? Name { get; set; }
        [JsonProperty("Customer")]
        public List<Customer>? Customers{ get; set; }            *//Error 1*
        [JsonProperty("OtherProperty")]
        public object? OtherProperty{ get; set; }                *//Error 2*
}

上面的代码给出错误为:-错误1:类型'对象'必须是不可为空的值类型,以便在通用类型或方法'为可为空'中将其用作参数'T'错误2:类型“列表”必须是非空值类型,才能在通用类型或方法“空”中将其用作参数“ T”。

请向我解释以上情况,并为我提供替代解决方案。

c# .net nullable non-nullable
3个回答
1
投票

stringListobject均为参考类型。这些默认情况下可以为空。 Nullable类型(例如int?Nullable<int>的简写)仅用于值类型。

在C#8.0中,引入了一个新功能,该功能允许non可为空的引用类型-即明确禁止空值分配的引用类型。这是一项可选功能-您可以启用它以使您更清楚地显示有关参考的意图。如果使用此选项,则用于定义nullable引用类型的语法与可为空的值类型相同:

string nonNullableString = null; // Error
string? nullableString = null;   // Ok

请记住,启用不可为空的引用类型意味着?后面没有的所有引用类型都是不可为空的;这可能需要您在应用程序中进行很多更改。

所以有两种选择。要么启用不可为空的引用类型,然后您需要显式标记要具有可为空的引用类型,或者坚持使用可为空的引用类型,并为相同的结果使用string而不是string?。我鼓励默认使用非空类型,因为它可以避免整个类的常见编程错误。


0
投票

如果您不使用C# 8

object?不存在。 object已经可以为空。

List<Customer>?不存在。 List<Customer>已经可以为空。

如果要使用nullable reference types,则必须更新编译器版本!


-1
投票

Nullable<T>类型要求T是不可为空的值类型,例如intDateTime。像stringList这样的引用类型已经可以为空。允许Nullable<List<T>>之类的东西是没有意义的,因此是不允许的。

© www.soinside.com 2019 - 2024. All rights reserved.