rksoftware

Visual Studio とか C# とかが好きです

C# 11 の新機能を確認「 "警告ウェーブ 7" 」

C# 11 の新機能を確認しています。目次は次の記事です。
rksoftware.hatenablog.com

今回は 「 "警告ウェーブ 7" 」。公式 Learn の記事は次です。

learn.microsoft.com

新しい警告 ( warning ) が追加されました。型名がすべて英小文字だと警告になります。

■ 確認

次のようなコードが警告になります。

class saitama { }   // 警告 CS8981    型名 'saitama' には、小文字の ASCII 文字のみが含まれています。このような名前は、プログラミング言語用に予約されている可能性があります。
警告 CS8981    型名 'xxxxxxxx' には、小文字の ASCII 文字のみが含まれています。このような名前は、プログラミング言語用に予約されている可能性があります。

ちなみに前者のコードは .NET 6 を指定した場合はエラーになりません。
今後 C# のキーワードはすべて小文字で追加されるので、この警告に従って小文字でない文字を型名に含めていれば、今後のキーワード追加時に競合する心配がなくなるという素晴らしい機能です。

いくつかのパターンで OK パターンを確認してみましょう。

class saitama { }   // 警告
class saitama1 { }  // 数字が含まれているので OK
class saitamaA { }  // 大文字が含まれているので OK
class saitama_ { }  // 記号が含まれているので OK
class 埼玉 { }      // 非 ASCII 文字が含まれているので OK

■ 警告でなくエラーにする

この素晴らしい警告、絶対に守りたい! そう考えていますね? 次の要素を .csproj に書き足せば警告でなくエラーになってくれます。

<TreatWarningsAsErrors>true</TreatWarningsAsErrors>

.csproj 全体はこんな感じです。

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net7.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
    
    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>

</PropertyGroup>

</Project>

この設定、すばらしいのですが警告がすべてエラーになります。私個人としてはそれでよいと思うのですが、そうはいかない場合もあるでしょう。その場合は、今回の機能だけをエラーにすることもできます。

<WarningsAsErrors>CS8981</WarningsAsErrors>  
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net7.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>

    <WarningsAsErrors>CS8981</WarningsAsErrors>  

</PropertyGroup>

</Project>

もし基本としては警告はすべてエラーにしているのだけれども、一時的に今回の機能だけはエラーにしたくないという場合は次のような感じです。

<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
<WarningsNotAsErrors>CS8981</WarningsNotAsErrors>
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net7.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>

    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
    <WarningsNotAsErrors>CS8981</WarningsNotAsErrors>

  </PropertyGroup>

</Project>

あってはならないことですが、大いなる力によって警告にすることも許されない、そういうこともあるでしょう。そんな不幸にはこれです。

<NoWarn>CS8981</NoWarn>
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net7.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>

    <NoWarn>CS8981</NoWarn>

  </PropertyGroup>

</Project>

■ 踏まないと思いますが

正直、多くの方はこの機能を見ることはないと思います。しかし一部何かの不幸によってどうにかしなければならない人ももしかしたら現れるかもしれません。警告を消す方法もあるので、ピンチの時には思い出してください。