Movatterモバイル変換


[0]ホーム

URL:


Skip to main content

This browser is no longer supported.

Upgrade to Microsoft Edge to take advantage of the latest features, security updates, and technical support.

Download Microsoft EdgeMore info about Internet Explorer and Microsoft Edge
Table of contentsExit focus mode

C# Compiler Options for language feature rules

  • 2024-09-27
Feedback

In this article

The following options control how the compiler interprets language features. The new MSBuild syntax is shown inBold. The oldercsc.exe syntax is shown incode style.

  • CheckForOverflowUnderflow /-checked: Generate overflow checks.
  • AllowUnsafeBlocks /-unsafe: Allow 'unsafe' code.
  • DefineConstants /-define: Define conditional compilation symbol(s).
  • LangVersion /-langversion: Specify language version such asdefault (latest major version), orlatest (latest version, including minor versions).
  • Nullable /-nullable: Enable nullable context, or nullable warnings.

Note

Refer toCompiler options for more information on configuring these options for your project.

CheckForOverflowUnderflow

TheCheckForOverflowUnderflow option controls the default overflow-checking context that defines the program behavior if integer arithmetic overflows.

<CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>

WhenCheckForOverflowUnderflow istrue, the default context is a checked context and overflow checking is enabled; otherwise, the default context is an unchecked context. The default value for this option isfalse, that is, overflow checking is disabled.

You can also explicitly control the overflow-checking context for the parts of your code by using thechecked andunchecked statements.

For information about how the overflow-checking context affects operations and what operations are affected, see thearticle aboutchecked andunchecked statements.

AllowUnsafeBlocks

TheAllowUnsafeBlocks compiler option allows code that uses theunsafe keyword to compile. The default value for this option isfalse, meaning unsafe code isn't allowed.

<AllowUnsafeBlocks>true</AllowUnsafeBlocks>

For more information about unsafe code, seeUnsafe Code and Pointers.

DefineConstants

TheDefineConstants option defines symbols in all source code files of your program.

<DefineConstants>name;name2</DefineConstants>

This option specifies the names of one or more symbols that you want to define. TheDefineConstants option has the same effect as the#define preprocessor directive except that the compiler option is in effect for all files in the project. A symbol remains defined in a source file until an#undef directive in the source file removes the definition. When you use the-define option, an#undef directive in one file has no effect on other source code files in the project. You can use symbols created by this option with#if,#else,#elif, and#endif to compile source files conditionally. The C# compiler itself defines no symbols or macros that you can use in your source code; all symbol definitions must be user-defined.

Note

The C##define directive does not allow a symbol to be given a value, as in languages such as C++. For example,#define cannot be used to create a macro or to define a constant. If you need to define a constant, use anenum variable. If you want to create a C++ style macro, consider alternatives such as generics. Since macros are notoriously error-prone, C# disallows their use but provides safer alternatives.

LangVersion

The default language version for the C# compiler depends on the target framework for your application and the version of the SDK or Visual Studio installed. Those rules are defined inC# language versioning.

Warning

Setting theLangVersion element tolatest is discouraged. Thelatest setting means the installed compiler uses its latest version. That can change from machine to machine, making builds unreliable. In addition, it enables language features that may require runtime or library features not included in the current SDK.

TheLangVersion option causes the compiler to accept only syntax that is included in the specified C# language specification, for example:

<LangVersion>9.0</LangVersion>

The following values are valid:

ValueMeaning
previewThe compiler accepts all valid language syntax from the latest preview version.
latestThe compiler accepts syntax from the latest released version of the compiler (including minor version).
latestMajor
ordefault
The compiler accepts syntax from the latest released major version of the compiler.
14.0The compiler accepts only syntax that is included in C# 14 or lower.
13.0The compiler accepts only syntax that is included in C# 13 or lower.
12.0The compiler accepts only syntax that is included in C# 12 or lower.
11.0The compiler accepts only syntax that is included in C# 11 or lower.
10.0The compiler accepts only syntax that is included in C# 10 or lower.
9.0The compiler accepts only syntax that is included in C# 9 or lower.
8.0The compiler accepts only syntax that is included in C# 8.0 or lower.
7.3The compiler accepts only syntax that is included in C# 7.3 or lower.
7.2The compiler accepts only syntax that is included in C# 7.2 or lower.
7.1The compiler accepts only syntax that is included in C# 7.1 or lower.
7The compiler accepts only syntax that is included in C# 7.0 or lower.
6The compiler accepts only syntax that is included in C# 6.0 or lower.
5The compiler accepts only syntax that is included in C# 5.0 or lower.
4The compiler accepts only syntax that is included in C# 4.0 or lower.
3The compiler accepts only syntax that is included in C# 3.0 or lower.
ISO-2
or2
The compiler accepts only syntax that is included in ISO/IEC 23270:2006 C# (2.0).
ISO-1
or1
The compiler accepts only syntax that is included in ISO/IEC 23270:2003 C# (1.0/1.2).

Considerations

  • To ensure that your project uses the default compiler version recommended for your target framework, don't use theLangVersion option. You can update the target framework to access newer language features.

  • SpecifyingLangVersion with thedefault value is different from omitting theLangVersion option. Specifyingdefault uses the latest version of the language that the compiler supports, without taking into account the target framework. For example, building a project that targets .NET 6 from Visual Studio version 17.6 uses C# 10 ifLangVersion isn't specified, but uses C# 11 ifLangVersion is set todefault.

  • Metadata referenced by your C# application isn't subject to theLangVersion compiler option.

  • Because each version of the C# compiler contains extensions to the language specification,LangVersion doesn't give you the equivalent functionality of an earlier version of the compiler.

  • While C# version updates generally coincide with major .NET releases, the new syntax and features aren't necessarily tied to that specific framework version. Each specific feature has its own minimum .NET API or common language runtime requirements that may allow it to run on downlevel frameworks by including NuGet packages or other libraries.

  • Regardless of whichLangVersion setting you use, use the current version of the common language runtime to create your.exe or.dll. One exception is friend assemblies andModuleAssemblyName, which work under-langversion:ISO-1.

For other ways to specify the C# language version, seeC# language versioning.

For information about how to set this compiler option programmatically, seeLanguageVersion.

C# language specification

VersionLinkDescription
C# 8.0 and laterdownload PDFC# Language Specification Version 7: .NET Foundation
C# 7.3download PDFStandard ECMA-334 7th Edition
C# 6.0download PDFStandard ECMA-334 6th Edition
C# 5.0Download PDFStandard ECMA-334 5th Edition
C# 3.0Download DOCC# Language Specification Version 3.0: Microsoft Corporation
C# 2.0Download PDFStandard ECMA-334 4th Edition
C# 1.2Download DOCStandard ECMA-334 2nd Edition
C# 1.0Download DOCStandard ECMA-334 1st Edition

Minimum SDK version needed to support all language features

The following table lists the minimum versions of the SDK with the C# compiler that supports the corresponding language version:

C# versionMinimum SDK version
C# 12Microsoft Visual Studio/Build Tools 2022 version 17.8, or .NET 8 SDK
C# 11Microsoft Visual Studio/Build Tools 2022 version 17.4, or .NET 7 SDK
C# 10Microsoft Visual Studio/Build Tools 2022, or .NET 6 SDK
C# 9.0Microsoft Visual Studio/Build Tools 2019 version 16.8, or .NET 5 SDK
C# 8.0Microsoft Visual Studio/Build Tools 2019, version 16.3, or .NET Core 3.0 SDK
C# 7.3Microsoft Visual Studio/Build Tools 2017, version 15.7
C# 7.2Microsoft Visual Studio/Build Tools 2017, version 15.5
C# 7.1Microsoft Visual Studio/Build Tools 2017, version 15.3
C# 7.0Microsoft Visual Studio/Build Tools 2017
C# 6Microsoft Visual Studio/Build Tools 2015
C# 5Microsoft Visual Studio/Build Tools 2012 or bundled .NET Framework 4.5 compiler
C# 4Microsoft Visual Studio/Build Tools 2010 or bundled .NET Framework 4.0 compiler
C# 3Microsoft Visual Studio/Build Tools 2008 or bundled .NET Framework 3.5 compiler
C# 2Microsoft Visual Studio/Build Tools 2005 or bundled .NET Framework 2.0 compiler
C# 1.0/1.2Microsoft Visual Studio/Build Tools .NET 2002 or bundled .NET Framework 1.0 compiler

Nullable

TheNullable option lets you specify the nullable context. It can be set in the project's configuration using the<Nullable> tag:

<Nullable>enable</Nullable>

The argument must be one ofenable,disable,warnings, orannotations. Theenable argument enables the nullable context. Specifyingdisable will disable the nullable context. When you specify thewarnings argument, the nullable warning context is enabled. When you specify theannotations argument, the nullable annotation context is enabled. The values are described and explained in the article onNullable contexts. You can learn more about the tasks involved in enabling nullable reference types in an existing codebase in our article onnullable migration strategies.

Note

When there's no value set, the default valuedisable is applied, however the .NET 6 templates are by default provided with theNullable value set toenable.

Flow analysis is used to infer the nullability of variables within executable code. The inferred nullability of a variable is independent of the variable's declared nullability. Method calls are analyzed even when they're conditionally omitted. For instance,Debug.Assert in release mode.

Invocation of methods annotated with the following attributes will also affect flow analysis:

Important

The global nullable context does not apply for generated code files. Regardless of this setting, the nullable context isdisabled for any source file marked as generated. There are four ways a file is marked as generated:

  1. In the .editorconfig, specifygenerated_code = true in a section that applies to that file.
  2. Put<auto-generated> or<auto-generated/> in a comment at the top of the file. It can be on any line in that comment, but the comment block must be the first element in the file.
  3. Start the file name withTemporaryGeneratedFile_
  4. End the file name with.designer.cs,.generated.cs,.g.cs, or.g.i.cs.

Generators can opt-in using the#nullable preprocessor directive.

Collaborate with us on GitHub
The source for this content can be found on GitHub, where you can also create and review issues and pull requests. For more information, seeour contributor guide.

Feedback

Was this page helpful?

YesNo

In this article

Was this page helpful?

YesNo