gpt4 book ai didi

c# - 为什么 Visual Studio 将新创建的数组键入为可空?

转载 作者:行者123 更新时间:2023-12-03 09:40:32 25 4
gpt4 key购买 nike

我正在编写一个具有泛型类型的函数 TVal .我写了这一行:

var zeroBased = new TVal[size];

然后在 Visual Studio (VS) 中,我使用 alt+enter 替换 var具有显式类型。这是我得到的:
TVal[]? zeroBased = new TVal[size];

我惊讶地发现 ?运算符,指示该类型可能为空。我认为如果使用 new 创建时类型永远不会为空,我就足够安全了。 ,并且可以刚刚完成:
TVal[] zeroBased = new TVal[size];

是否存在在 C# 中实例化新数组可以返回 null 的情况?

注意:代码在没有 ? 的情况下似乎可以很好地编译,我只是对 VS 的建议很感兴趣......

最小可验证示例

打开 Visual Studio,与下面指定的版本相同,创建一个新项目,根据下面的 VS 项目文件内容启用可为空类型,创建一个新类,并弹出此函数:
public void Test<T>(int size)
{
var tArr = new T[size];
}

选择 var并点击 alt+enter ,并选择替换 var具有显式类型。如果行为与我所经历的相同,您将得到:
public void Test<T>(int size)
{
T[]? tArr = new T[size];
}

Visual Studio 项目文件内容

我们在这个项目中使用 C# 8 并且我们启用了 Nullables:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<Nullable>enable</Nullable>
<LangVersion>8.0</LangVersion>
<WarningsAsErrors>CS8600;CS8602;CS8603</WarningsAsErrors>
<TargetFramework>netstandard2.0</TargetFramework>
<OutputType>Library</OutputType>
<Version>1.0.0.9</Version>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.CSharp" Version="4.7.0" />
<PackageReference Include="System.Dynamic.Runtime" Version="4.3.0" />
</ItemGroup>

</Project>

Visual Studio 版本信息(只是对这个 Q 很重要的部分)

微软 Visual Studio 社区 2019
版本 16.6.1
VisualStudio.16.Release/16.6.1+30128.74
微软 .NET 框架
版本 4.7.03062

安装版本:社区

C# 工具 3.6.0-4.20251.5+910223b64f108fcf039012e0849befb46ace6e66
IDE 中使用的 C# 组件。根据您的项目类型和设置,可能会使用不同版本的编译器。

最佳答案

我想通过添加一些链接来扩展现有答案

C# specification proposal says :

nullable implicitly typed local variables

var infers an annotated type for reference types. For instance, in var s = ""; the var is inferred as string?.



这意味着 var对于引用类型,推断出一个可为空的引用类型。如果 nullable context,这有效使用项目文件或 #nullable 启用语用。

此行为已被讨论 in this LDM并在此实现 issue .

This is a reason用于制作 var推断一个可为空的引用类型:

At this point we've seen a large amount of code that requires people spell out the type instead of using var, because code may assign null later.

关于c# - 为什么 Visual Studio 将新创建的数组键入为可空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65629861/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com