« Csharp 8 » : différence entre les versions
De Banane Atomic
Aller à la navigationAller à la recherche
Ligne 98 : | Ligne 98 : | ||
// null-forgiving operator | // null-forgiving operator | ||
Console.WriteLine(s2!.Length); // in this case we know that s2 is not null, so we can use "!" to instruct the compiler "s2" is not null here | Console.WriteLine(s2!.Length); // in this case we know that s2 is not null, so we can use "!" to instruct the compiler "s2" is not null here | ||
// allow null even if the type is not nullable | |||
public void DemoRef([AllowNull]ref string value) | |||
{ } | |||
// disallow null even if the type is nullable | |||
public void DemoRef([DisallowNull]ref string? value) | |||
{ } | |||
</kode> | </kode> | ||
Version du 4 mars 2020 à 16:33
Liens
Switch expression
switch (i) { case 1: return "One"; default: throw new Exception("Invalid value"); } i switch { 1 => "One", _ => throw new Exception("Invalid value") }; |
Using declaration
using (var file = new StreamWriter("MyFile.txt")) { // some code } // file is disposed here void MyMethod() { using var file = new StreamWriter("MyFile.txt"); // some code // file is disposed here, at the end of the enclosing scope } |
Static local function
int x = 5; int y = 7; return Add(x, y); // Can be static because it doesn't access any variables in the enclosing scope static int Add(int left, int right) => left + right; |
Asynchronous streams / async yield
public static async IAsyncEnumerable<int> GenerateSequence() { for (int i = 0; i < 20; i++) { await Task.Delay(100); yield return i; } } await foreach (var number in GenerateSequence()) { Console.WriteLine(number); } |
Indices and ranges
var latest = myList[^1]; var secondToFour = myList[2..5]; var lastTwo = myList[^2..^0]; var firstThree = myList[..4]; var allExceptFirst = myList[2..]; |
Null-coalescing assignment / ?? =
int? i = null; i = i == null ? 20 : i; i ??= 20; // assign 20 to i if i is null |
Nullable reference type
MyProject.csproj |
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>netcoreapp3.1</TargetFramework> <!-- add this line to enable it --> <Nullable>enable</Nullable> |
Now by default everything is non nullable. If you want to declare a type as accepting null values, you need to add ? after the type.
string s1 = null; // Warning: Converting null literal or possible null value to non-nullable type. string? s2 = null; // ok // null-forgiving operator Console.WriteLine(s2!.Length); // in this case we know that s2 is not null, so we can use "!" to instruct the compiler "s2" is not null here // allow null even if the type is not nullable public void DemoRef([AllowNull]ref string value) { } // disallow null even if the type is nullable public void DemoRef([DisallowNull]ref string? value) { } |
.NET Framework
The C# 8 / .NET Framework combination is not officially supported by Microsoft.
It can be forced by editing the csproj file.
MyProject.csproj |
<?xml version="1.0" encoding="utf-8"?> <Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <PropertyGroup> <TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion> <LangVersion>8.0</LangVersion> |
- default interface members won't work
- ssynchronous streams and indices and ranges will need polyfill nuget package