如何在 C# 7.3 中使引用类型可为空?

ses*_*eed 12 .net linq

我现在无法升级Net。我想实现这样public SiteOptionModel? Site { get; set; }的目标bool?。但它说我应该升级.Net,但我担心升级.Net会毁掉一个相当大的项目。有什么办法可以实现这一点吗?

public bool IsVisibleInGrid { get; set; }
public SiteOptionModel? Site { get; set; }
public bool? IsDeleted { get; set; }

Run Code Online (Sandbox Code Playgroud)

LinQ 查询显示没有 SiteId 的错误

from truck in database.Truck
   where truck.CarrierId == carrierId
         && (truck.IsDeleted == null || truck.IsDeleted == false)
   orderby truck.Code
   select new CarrierDetailViewModel.TruckModel2
   {
       Id = truck.TruckId,

       Site = new CarrierDetailViewModel.SiteOptionModel{
            Id = (int)truck.SiteId,
            Name = truck.Site.Name,
            Code = truck.Site.Code
       }
   } ;

Run Code Online (Sandbox Code Playgroud)

错误

严重性代码 说明 项目文件行抑制状态错误 CS8370 功能“可空引用类型”在 C# 7.3 中不可用。请使用 8.0 或更高版本的语言。

The*_*aot 12

编译器要求您使用该语言的较新版本,而不是 .NET 的较新版本。.NET 的每个版本都支持可为 null 的引用类型。在任何版本的 .NET 中,引用都可能为 null,只是在 C# 8.0 之前无法在 C# 中对其进行注释。

\n\n

但是,您的项目配置为 C# 7.3,您需要更改语言版本。整个项目请参考如何启用C#8.0的Nullable Reference Types特性。

\n\n

另请参阅C# 和 .NET 之间有什么区别?

\n\n

一旦您为 C# 8.0 配置了项目并启用了可空引用类型\xe2\x80\xa6 Roslyn,C# 编译器将理解可空性注释并基于它们提供代码分析。

\n\n

无论如何你都必须处理 null 。这可能意味着空检查。即使在 C# 8.0 中,访问空引用的成员仍然是NullReferenceException。至少静态分析会对您有所帮助。

\n\n

请参阅什么是 NullReferenceException,以及如何修复它?

\n\n
\n\n

如果您确实需要在旧运行时(例如async/await在 .NET 2.0 中)上运行新功能,我可能会为您提供一个解决方案:Theraot.Core。坦白说,我是其中的作者。

\n

  • 我刚刚将其添加到``.csproj````。<PropertyGroup> ... <NullableReferenceTypes>true</NullableReferenceTypes> <LangVersion>8.0</LangVersion> </PropertyGroup> 红线消失了,但问号下方有一条绿线 (4认同)