C++ ときどき ごはん、わりとてぃーぶれいく☆

Wonder Rabbit Projectのなかのひとのブログ。主にC++。

C#, LINQ, Lambda-expression: LINQ の query-expression の中の select 句で lambda-expression を吐かせたい。でも C# ちゃんが翻訳死しちゃったの、ってスタック・オーバーフロー・チャンスしたら .NET イケメンの Reza Aqhaei が助けてくれたメモ。

// Example-0; 突然の翻訳死が訪れるよ
var xs = from v in Enumerable.Range( 0, 4 ) select w => w;

こういう事をしたいけど、これじゃ C# コンパイラーちゃんが死んじゃう😅

error CS1942: An expression type in select' clause is incorrect. Type inference failed in the call toSelect'

とりあえずラムダじゃなかったらキャプれるよね、というわけで、

// Example-1; こうすれば動くんだけどー
Func< int, int > f = w => w;
var xs = from v in Enumerable.Range( 0, 4 ) select ( v, f );

事前に定義して変数に束縛しておいたラムダと値のタプルを吐くってのはまあ、すぐに思い付いた妥協策だったんだ。

なんで「値とファンクターのタプルなんかを吐かせたの?」って??

そりゃぁ、だって、ぁぁーた、

// Example-2; 最初の例よろしくコレはダメなのよ
var xs = from v in Enumerable.Range( 0, 4 ) select w => w + v;

こういう事をしたかったからじゃないのさ😂 涙ぐましいタプルだったってわけ。

それで、「あーもう閃の軌跡したいんじゃーーーー(でもオレオレライブラリーの実装途中の機能が終わらないのもいやなんじゃあーーー」ってわけで、他力本願。

(お悩みを)必殺、スタック・オーバーフロー・チャーンス!

そしたら .NET イケメンの Reza Aghaei がササッと Answer してくれた😃

// Reza Aqhaei の教えてくれた Anser 
var xs = from v in Enumerable.Range(0, 4) select new Func<int, int>(x => x + v);

ぉーぃぇぁ、なるほどだよ・w・

lamda の直接キャプチャーが叶わないが、 Func<int,int> はキャプチャーできたところで気づけなかったのはちょっと悔しい。ありがとう、 Reza Aqhaei 🍣