Я пишу функцию с универсальным типом TVal
. Я написал такую строчку:
var zeroBased = new TVal[size];
А затем в Visual Studio (VS) я использовал alt + enter, чтобы заменить var
явным типом. Вот что у меня получилось:
TVal[]? zeroBased = new TVal[size];
Я был удивлен, обнаружив оператор ?
, указывающий на то, что тип может иметь значение NULL. Я думал, что буду в безопасности, если предположить, что тип никогда не будет нулевым при создании с помощью new
, и мог бы только что сделать:
TVal[] zeroBased = new TVal[size];
Есть ли сценарий, при котором создание экземпляра нового массива в C # может вернуть значение null?
Примечание: код, похоже, отлично компилируется без ?
, я просто заинтригован предложением VS ...
Минимальный проверяемый пример
Откройте Visual Studio той же версии, что указана ниже, создайте новый проект, включите типы, допускающие значение NULL, в соответствии с содержимым файла проекта 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 (только те части, которые казались важными для этого вопроса)
Microsoft Visual Studio Community 2019 версии 16.6.1 VisualStudio.16.Release / 16.6.1 + 30128.74 Microsoft .NET Framework версии 4.7.03062
Установленная версия: Сообщество
Инструменты C # 3.6.0-4.20251.5 + 910223b64f108fcf039012e0849befb46ace6e66 Компоненты C #, используемые в среде IDE. В зависимости от типа и настроек вашего проекта может использоваться другая версия компилятора.
T[]
с указанным кодом - person Pavel Anikhouski   schedule 08.06.2020