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
も標準ライブラリのクラスなのでいくらでも繋げられてしまいますね。
予約語ではないという意味では、記事タイトルもまずかったかもです。
趣旨としましては、なるべく予約語や標準ライブラリのみで
単語をつなげて文章を作ろうと思った次第ですので
そのように受け取っていただければと幸いです。