C#の予約語でミスチル曲紹介
きっかけ
Enumerable.Anyメソッドって使わないなぁ🤔
if文に限らず、どんなケースでも使ったことない😎
余談
ツイートの主は、先日はてぶトップに上がっていた👇を書かれた御仁です
イイネ数200越え!
そういえば
ミスチルの曲にAnyってあったなあ🤔
2002年、Mr.Childrenがシングル"Any"を制作。

キャプチャの出典はDeepL翻訳ツールです🤳
インスパイア・ド・バイ
Anyキーワードをどうしても使いたい!
👆まさに神々の遊び
できたもの
じゃじゃーん🐔
using System;
using System.Linq;
namespace workdir;
class Program
{
[STAThread]
static void Main(string[] args)
{
System.Windows.Controls.Grid Mr = new();
var _ = (in DateTime _) => (2002, _.Year, Mr.Children.Cast<Single>().Any());
Console.WriteLine("Hello, Zenn!");
}
}
ここがミソ🐥
2002とMr以外はキーワード ―― C#が予約している言葉
var _ = (in DateTime _) => (2002, _.Year, Mr.Children.Cast<Single>().Any());
varを除けば、DeepL左辺になる🤡 なんて作為的な!

※ キャプチャは再掲です
ちゃんと実行できます
dotnet run
Hello, Zenn!
あとで気づいたこと
タプル型は禁じ手だったかも・・・いくらでもカンマ区切りで繋げられる
試行錯誤の過程
Visual Studio Codeを開きます
OSはWindows 11 Homeです
プロジェクトをつくる
.NET 5.0でつくり初めますが、すぐに.NET 6.0へ変更します
- 理由は、最上位ステートメントを使いたくないからです
- エントリポイントである
static Main()メソッドに、アトリビュートを付けたいからです
- エントリポイントである
mkdir workdir
cd workdir
dotnet new console --framework="net5.0"
code workdir.csproj
ターゲットを.NET 6へ変更する
ついでにWPFも有効にします
画面は使いませんが、画面の部品を使います
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<!-- 変更ここから -->
<TargetFramework>net6.0-windows</TargetFramework>
<UseWPF>true</UseWPF>
<!-- 変更ここまで -->
</PropertyGroup>
</Project>
Program.csを書き換える
いったん実行してみて、ハローワールドしてくれることを確認する
code Program.cs
dotnet run
Hello World!
Main()にアトリビュートをつける
[STAThread]をつけないと、👇と怒られる
Unhandled exception. System.InvalidOperationException: 呼び出しスレッドは、多数の UI コンポーネントが必要としているため、STA である必要があります。
[STAThread]
static void Main(string[] args) { /* ... */ }
Children探し
C# ChildrenでWeb検索すると、WPFの画面部品であるパネルがヒットする
-
PresentationFramework.dllを使うために、.csprojでUseWPFを有効にした -
.Childrenの型はUIElementCollectionであり、IEnumerableの実装である。IEnumerable<T>の実装ではない。Children.Any()やChildren.Select()などは不可
ラムダ式をvarで受けられるのは、.NET 6.0から
ターゲットを.NET 5.0に落として実行すると、👇と怒られる
'推論されたデリゲート型' は C# 9.0 では使用できません。言語バージョン 10.0 以上を使用してください。
C# 10.0、すなわち.NET 6.0以上が要件
(wikipediaにC#のバージョンとフレームワークの対応表が載っている)
.NET 5.0以前は、ラムダ式の入力部にinがつけられない?
つけると構文エラーを指摘される
// .NET 5.0 では左辺を var にできないので、愚直に Func を書く
Func<DateTime, (int, int, bool)> _ = (DateTime _) => // ...
// さらには、ラムダ式の入力に in キーワードをつけられない
// (つけると構文エラーになる・・・なぜだろう)
Func<DateTime, (int, int, bool)> _ = (in DateTime _) => // ... <-構文エラー
エラー CS1677 パラメーター 1 はキーワード 'in' で宣言しないでください
エラー CS1661 パラメーター型がデリゲート パラメーター型と一致しないため、ラムダ式 を型 'Func<DateTime, (int, int, bool)>' に変換することはできません
左辺をvarにすれば上記エラーは発生しない
すなわち、左辺をvarにできない.NET 5.0以前では、ラムダ式の入力にinがつけられない(と思う)
var f1 = (in int x) => x; // OK
Func<int, int> f2 = (in int x) => x; // 構文エラー
おわりに
.Any()を使うシチュエーションを考えてたら思いついただけ記事でした
適当なテーマ設定の割に、調べものしないと詰まる所があり、少しは蓄えになったと信じたい
参考にさせていただいたサイト
Discussion
DateTime も Singleも標準ライブラリで提供されているだけのただの構造体やクラスではないでしょうか?
これがOKならそれこそいくらでも繋げられるのでは?
コメントありがとうございます!
おっしゃる通りで
DateTimeもSingleも標準ライブラリのクラスなのでいくらでも繋げられてしまいますね。
予約語ではないという意味では、記事タイトルもまずかったかもです。
趣旨としましては、なるべく予約語や標準ライブラリのみで
単語をつなげて文章を作ろうと思った次第ですので
そのように受け取っていただければと幸いです。