18
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

C#Advent Calendar 2022

Day 8

C#11の.NET 6.0と.NET Framework 4.8に対する互換性

Last updated at Posted at 2022-12-07

初めに

2022年11月、.NET 7.0がリリースされ、それと同時にC#11も安定版として使えるようになった。
C#11の各種機能は.NET 7.0ならば問題なく使用可能だが、それ以前のバージョン(.NET 6や.NET Framework)の場合、そのままでも使えるものと扱いに注意が必要なものがある。
ただし、基本的にSDKがデフォルトで設定するLangVersion以外で使用する場合は基本的に自己責任という事に注意は必要。
デフォルトが設定されているのはそれなりに理由があるものなのである。
ただし、どうしても使いたい人(含む自分)もいると思うので、参照しやすいようにまとめることにした。

C#11についての詳細解説はしないので、各仕様の公式解説は下記URLを参照のこと。
https://learn.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-11

また、未確認飛行Cのサイトも、公式よりもわかりやすい形で解説しているので参考にしてほしい。
https://ufcpp.net/study/csharp/cheatsheet/ap_ver11/

プロジェクト設定

まず、 各TargetFrameworkはデフォルトでは使う言語バージョンが決まっている ため、C#11の各種機能を使う場合はビルド時の設定で明示的に指定する必要がある。
やり方としては、csprojのPropertyGroupにLangVersionを加えるということになる。
記述例は以下

<PropertyGroup>
  <!-- latestでも可 -->
  <LangVersion>11.0</LangVersion>
</PropertyGroup>

対応状況

先に新機能と互換性を記述しておくと以下のようになる。

〇: 特に意識せず使用可能
△: 追加のクラス定義等、特別対応が必要
×: 使えない(実行時エラー含む)

機能名 net6.0 net48
File-scoped types
static virtual members interfaces × ×
Generic math support × ×
Pattern match Span<char> on a constant string
Extended nameof scope
Auto-default struct
Numeric IntPtr
UTF-8 string literals
Required members
ref fields × ×
scoped ref
Raw string literals
Improved method group conversion to delegate
Warning wave 7
Generic Attributes ×
Newlines in string interpolation expressions
List patterns

両方〇になっているものは省き、注意が必要なものと、対応がアウトなものの解説を記述する。

static virtual members interfaces

ランタイムレベルでnet7.0以降が必要になるのでビルドで失敗する。

Generic math support

Generic mathで前提となるstatic virtual members interfacesがnet7.0以降のランタイムが必要なので使えない。

Pattern match Span<char> on a constant string

Spanを使うので、.NET Frameworkの場合はSystem.Memoryパッケージの参照が必要。
ただし、.NET Frameworkで使うSpanはslow spanなので、性能特性がnet6.0とは異なることに注意。

UTF-8 string literals

u8を付けたものはReadOnlySpan<byte>となるため、System.Memoryパッケージの参照が必要。
ただし、.NET Frameworkで使うSpanはslow spanなので、性能特性がnet6.0とは異なることに注意。

Required members

以下のクラス定義が必要。

なお、当然のことながらnet7.0で定義すると衝突を起こすので、プロジェクトのTargetFrameworkがnet7.0以降を含んでいる場合は、
プリプロセッサやビルド設定などで回避を行うこと。

ref fields

ランタイムからサポートの必要があるので使用不可。
使おうとするとCS9064エラーが発生する。
セットで紹介されているscoped refは実は他のTargetFrameworkでも使用は可能。

Generic Attributes

net48に×がついているが、実はコンパイル自体は可能。
しかし、コンパイル後にType.GetCustomAttributes()を実行すると、NotSupportedExceptionが発生する。
実行時のランタイムで決まるので、netstandardでコンパイルした場合でも、実行EXEが.NET Frameworkだとエラーが出るので注意

List patterns

System.Index という型が必要なので、定義が必要。
.NET 7.0以降のTargetFrameworkだと衝突するため、ビルド設定等で回避を行うこと。

属性とは違って実装が必要になるため、dotnet/runtimeのソースそのままでは使用できないことに注意すること。

終わりに

当初想定していたよりも使えるが、罠も多いなというのが調べて思った所。
文字列関連なら罠も少ないので、個人的には使っていこうかなと思っている。

18
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?