전체 프로젝트에 대해 C # 8.0의 Nullable 참조 형식 기능을 활성화하는 방법


82

C # 8 발표 비디오 에 따르면 전체 프로젝트에 대해 "nullable reference types"기능을 활성화 할 수 있습니다.

하지만 프로젝트에서 어떻게 활성화할까요? Visual Studio 2019 Preview 1의 프로젝트 속성 창에서 새로운 적절한 옵션을 찾지 못했습니다.

.csprojC # 언어 버전이 8.0으로 변경된 경우 '레거시' 프로젝트에 대해 활성화 할 수 있습니까 ?

답변:


85

Visual Studio 16.2 (미리보기 1에서)에서는 속성 이름이으로 변경되었습니다 Nullable. 이는 더 간단하고 명령 줄 인수와 일치합니다.

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

netcoreapp3.0이상을 대상으로하는 경우 LangVersion.NET Core 3의 기본값 인 8 을 지정할 필요가 없습니다 .


이전 Visual Studio 버전의 경우 :

  • 16.0 미리보기 2에서 16.1로 설정 NullableContextOptions합니다 enable.
  • 16.0 미리보기 1에서 설정 NullableReferenceTypestrue.

3
방금 VS 2019 / 16.1.1로 시도했지만 아무것도하지 않는 것 같습니다. 이를 테스트하기 위해 클래스 중 하나에 #nullable enable을 입력하고 null 개체에 대한 경고를 볼 수 있습니다.
Larry Smith

2
@LarrySmith 사과드립니다.이 변경은 16.2P1에서 이루어졌습니다. 내 답변을 업데이트했습니다. 16.1.1에서는 NullableContextOptions여전히 필요합니다 .
Drew Noakes 19

1
부울 논리는 약간 직관적이지 않을 수 있습니다 enable. "기본적으로 유형이 null이 아닌 새로운 C # 8.0 설정을 사용하도록 설정"을 의미합니다. disable"모든 유형이 nullable 인 이전 방식으로 수행"을 의미합니다.
Ryan Lundy

1
또한 <Nullable>이 오래된 비 SDK 프로젝트에서 작동하기 전에 이전 "15,0"에서 <Project ToolsVersion = "16.0"...> 및 <VisualStudioVersion ...> 16.0 </ VisualStudioVersion>을 업데이트해야했습니다. VS 16.3 RTM의 속성 GUI를 통해 프레임 워크 4.8로 올바르게 업그레이드되었지만. 추가 프로젝트 파일 편집없이 C # 8 언어 버전 만 존중되었습니다.
Tony Wall

1
@TonyWall 왜 그게 필요했는지 궁금합니다. 방금 VS 16.3.7 (즉, 비 SDK 스타일 프로젝트)에서 새 .NET Framework 콘솔 앱을 LangVersion만들고에 Nullable속성을 추가 .csproj했으며 제대로 작동합니다. 프로젝트도 ToolsVersion="15.0"있습니다.
Drew Noakes

32

이 설정은 VS 2019 미리보기 1과 미리보기 2 사이에서 변경됩니다. 미리보기 2 또는 3을 사용하는 경우 다음에서 필요합니다 .csproj.

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

<NullableReferenceTypes>이전 답변에서 언급 한 대답이 기록 된 시간에 정확했다 (I 원래 2019년 2월 4일에이 답변을 작성, 허용 대답으로 표시되지 있었다), 그러나 더 이상 인식이다.


이 옵션 (에 해당하는 값에 대한 자세한 내용은 enable, disable, safeonly: 등) github.com/dotnet/roslyn/blob/master/docs/features/...
세르게이 V

8
최근 릴리스에서 다시 변경 되었습니까? 이것은 Preview 4.2에서 나를 위해 작동하지 않는 것 같습니다
waldrumpus

5
Visual studio 6.2 이후 <NullableContextOptions>는 <Nullable>로 단순화되었습니다 (허용되는 답변 참조)
Andrew Hill

13

@DrewNoakes 허용 답변 외에도 파일 이 포함 된 폴더에 라는 파일을 추가하여 모든 프로젝트에 대해 nullable 속성 을 한 번 에 설정할 수 있습니다 .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 : 솔루션 :

.NET Core 프로젝트에 대해 Nullable 참조 형식 기능을 사용하려면 다음과 같이 파일 에 NullableReferenceTypes속성을 추가 합니다 .csproj.

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

@JulienCouvreur가 https://github.com/dotnet/project-system/issues/4058 에 대한 의견에서 언급했듯이 새 속성은 '이전'프로젝트 시스템에서 아직 지원되지 않지만 C # 8.0이 릴리스되기 전에 지원됩니다.


대상 프레임 워크를로 변경해 보셨습니까 net472? 그런데 그 설정을 어떻게 / 어디에서 찾았습니까? 그 참조는 매우 유용 할 것입니다. 꽤 같이 비디오대로 작동하지 않는 많은 것들을 발견
파나지오티스 Kanavos을

원래의 질문에 연결된 비디오 I의 저자 - @PanagiotisKanavos는, 그 태그는 MADS Torgersen에 의해 유튜브에 대한 의견 제안했다
세르게이 V

1
이 속성은 '이전'프로젝트에서 아직 지원되지 않습니다. 문제는 github.com/dotnet/project-system/issues/4058에
Julien Couvreur

7

레거시 csproj 형식

레거시 .csproj형식 에 대해 물었습니다 . 텍스트 편집기에서 프로젝트 파일을 열고 다음과 같이 변경하십시오.

  1. 및 PropertyGroup 섹션 <LangVersion>8.0</LangVersion>에서 추가 / 변경 :DebugRelease

     <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
        <LangVersion>preview</LangVersion>
    
  2. <Nullable>enable</Nullable>main 에 추가 하여 nullable 참조 유형에 대한 지원을 활성화합니다 PropertyGroup.

     <PropertyGroup>
        <Nullable>enable</Nullable>
    

Visual Studio 2019 v16.2.0 Preview 3에서 C # 8 및 nullable 참조 형식 구문을 사용하여 .NET WinForms 앱으로 테스트되었습니다.


SDK 스타일 프로젝트 파일

SDK 스타일 프로젝트는 훨씬 간단하며 Visual Studio 내에서 편집 할 수 있습니다. 이러한 내용은 모두 당신이 필요 (에서 동일 PropertyGroupTargetFramework또는 TargetFrameworks) :

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

메모

  • .NET Core 3.x 프로젝트 는 기본적으로 C # 8 대상 으로 하므로 LangVersion해당 프로젝트에 대해을 지정할 필요가 없습니다 .

  • .NET Framework 프로젝트의 기본값은 C # 7.3이며 .NET Framework에서도 C # 8.0을 사용할 수 없습니다 <LangVersion>latest</LangVersion>. 언어 버전을 8.0으로 명시 적으로 설정해야합니다. C # 8은 .NET Framework를 지원합니까? 에 대한 내 대답을 참조하십시오 . 상세 사항은.


3

지금까지는 프로젝트의 속성 페이지에 노출 된 설정이기도합니다.

"빌드"탭에 "널 가능"설정이 표시됨

적어도 VS2019 16.6+에서.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.