Як увімкнути функцію Nullable Reference Types у C # 8.0 для всього проекту


82

Згідно з відеороликом оголошень C # 8, функцію "типові посилальні типи", які можна опустити, можна включити для всього проекту.

Але як включити його для проекту? Я не знайшов жодної нової відповідної опції у вікні Властивості проекту у Visual Studio 2019 Preview 1.

Чи можна його включити для «застарілих» .csprojпроектів, якщо версію мови C # змінити на 8.0?

Відповіді:


85

У Visual Studio 16.2 (з попереднього перегляду 1) ім'я властивості змінено на Nullableпростіше і узгоджується з аргументом командного рядка.

<PropertyGroup>
  ...
  <Nullable>enable</Nullable>
  <LangVersion>8.0</LangVersion>
</PropertyGroup>

Зауважте, що якщо ви націлюєтесь netcoreapp3.0або пізнішої версії, вам не потрібно вказувати LangVersionзначення 8, оскільки це за замовчуванням у .NET Core 3.


Для старих версій Visual Studio:

  • З попереднього перегляду 16.0 2 на 16.1 встановіть NullableContextOptionsна enable.
  • У попередньому перегляді 16.0 1 встановіть NullableReferenceTypesна true.

3
Я щойно спробував це з VS 2019 / 16.1.1, і, здається, нічого не зробив. Щоб перевірити це, я тоді пішов і ввів #nullable enable в одному з класів, і тоді я міг побачити попередження про нульові об'єкти.
Ларрі Сміт

2
@LarrySmith вибачається, ця зміна була внесена в 16.2P1. Я оновив свою відповідь. У 16.1.1 вам все NullableContextOptionsодно знадобиться .
Дрю

1
Зауважте, що логічна логіка може бути дещо не інтуїтивно зрозумілою: enableозначає "увімкнути новий параметр C # 8.0, де типи за замовчуванням не мають нульового значення". disableозначає "робити це по-старому, де кожен тип можна обнулити".
Райан Ланді

1
Мені також довелося оновити <Project ToolsVersion = "16.0" ...> та <VisualStudioVersion ...> 16.0 </VisualStudioVersion> зі старого "15,0", перш ніж <Nullable> працюватиме на старих проектах, що не належать до SDK, навіть незважаючи на те, що вони були коректно оновлені до фреймворку 4.8 за допомогою властивостей GUI VS 16.3 RTM. Лише мовна версія C # 8 була дотримана без додаткового редагування файлів проекту.
Тоні Стін,

1
@TonyWall Мені цікаво, навіщо тобі це потрібно. Я щойно створив нову програму .NET Framework Console у VS 16.3.7 (тобто проект не в стилі SDK), додав LangVersionі Nullableвластивості до, .csprojі вона працює нормально. Проект ToolsVersion="15.0"теж має .
Дрю

32

Зверніть увагу, що цей параметр змінено між попереднім переглядом VS 2019 та попереднім переглядом 2. З попереднім переглядом 2 або 3 вам потрібно це у вашому .csproj:

<PropertyGroup>
  <LangVersion>8.0</LangVersion>
  <NullableContextOptions>enable</NullableContextOptions>
</PropertyGroup>

<NullableReferenceTypes>Згадувалося в попередній відповіді (який, коли я спочатку написав цей відповідь на 4 лютого 2019 року, ні відзначений як загальноприйнятому відповідь) було правильним в той момент, відповідь була написана, але це вже не визнається.


більше інформації про доступні значення для цього параметра ( enable, disableта safeonlyін.): github.com/dotnet/roslyn/blob/master/docs/features/…
Сергій V

8
Чи змінилося це знову в недавньому випуску? Здається, це не працює для мене у попередньому перегляді 4.2
waldrumpus,

5
Оскільки Visual studio 6.2 <NullableContextOptions> було спрощено лише до <Nullable> (див. Прийняту відповідь)
Ендрю Хілл,

13

На додаток до прийнятої відповіді @DrewNoakes, зверніть увагу, що властивість, що допускає обнулення, можна встановити для всіх проектів одночасно , додавши файл, що викликається Directory.Build.propsдо папки, що містить ваш .slnфайл.

Просто визначте свій Directory.Build.propsфайл так:

<Project>

  <PropertyGroup>
    <Nullable>enable</Nullable>
  </PropertyGroup>

</Project>

Вам потрібно буде перезапустити Visual Studio, щоб це набрало чинності.

Більше про Directory.Build.props.


8

Щодо Visual Studio 2019 Preview 2 & 3 , див. Відповідь Ian Griffiths.

Рішення для Visual Studio 2019 Preview 1 :

Щоб увімкнути функцію Nullable Reference Types для проекту .NET Core, додайте NullableReferenceTypesвластивість до .csprojфайлу так:

<PropertyGroup>
  ...
  <NullableReferenceTypes>true</NullableReferenceTypes>
  <LangVersion>8.0</LangVersion>
</PropertyGroup>

Як посилається @JulienCouvreur у коментарях щодо https://github.com/dotnet/project-system/issues/4058 , нова властивість ще не підтримується у `` старій '' проектній системі, але буде підтримана до випуску C # 8.0.


Ви пробували змінити цільову структуру на net472? Як / де ви до речі знайшли цю обстановку? Це посилання було б дуже корисним. Я знайшов багато речей, які не зовсім працюють, як показано на відео
Панайотис Канавос,

@PanagiotisKanavos, цей тег був запропонований у коментарях на YouTube Мадсом Торгерсеном - автором відео, на яке я посилався в оригінальному запитанні
Сергій V

1
Ця властивість ще не підтримується у "старих" проектах. Випуск відстежується github.com/dotnet/project-system/issues/4058
Julien Couvreur

7

Спадковий формат csproj

Ви запитали про застарілий .csprojформат. Відкрийте файл проекту в текстовому редакторі та внесіть такі зміни:

  1. Додавання / зміна <LangVersion>8.0</LangVersion>в розділах Debugта ReleasePropertyGroup:

     <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
        <LangVersion>preview</LangVersion>
    
  2. Увімкніть підтримку типів посилань, що <Nullable>enable</Nullable>дозволяють онулювати, додавши до основного PropertyGroup:

     <PropertyGroup>
        <Nullable>enable</Nullable>
    

Перевірено за допомогою програми .NET WinForms із використанням C # 8 та синтаксисом посиланих типів, що допускає обнулення, у Visual Studio 2019 v16.2.0 Preview 3.


Файли проектів у стилі SDK

Проекти у стилі SDK набагато простіші, і їх можна редагувати в Visual Studio. Для них вам потрібно все (так само, PropertyGroupяк TargetFrameworkабо TargetFrameworks):

  <PropertyGroup>
    <LangVersion>8.0</LangVersion>
    <Nullable>enable</Nullable>
  </PropertyGroup>

Примітки

  • Проекти .NET Core 3.x за замовчуванням націлені на C # 8 , тому вам не потрібно буде вказувати LangVersionдля цих проектів.

  • Типовим для проектів .NET Framework є C # 7.3, і ви не отримуєте C # 8.0 навіть з <LangVersion>latest</LangVersion>. Ви повинні чітко встановити мовну версію 8.0. Будь ласка, зверніться до моєї відповіді на питання Чи підтримує C # 8 .NET Framework? для більш детальної інформації.


3

Варто зазначити, що на даний момент це також відкритий параметр на сторінці властивостей проекту:

На вкладці "Збірка" відображається параметр "Nullable"

Принаймні у VS2019 16.6+.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.