わかる人にとっては、当たり前といえば当たり前だが、
地味に時間を使ってしまったので、備忘録としてメモしておく。
staticclassTestExt{publicstaticboolIsTrue(thisboolsource)=>source;}boolFunc(Func<bool>func)=>func();boolIsTrue_Func()=>true.IsTrue();
拡張メソッドは、ぱっと見、引数無しのデリゲート型(引数無しの関数)に見えるので、
以下のような呼び出しをしてしまったところ、コンパイルエラーとなった。
(拡張メソッドを引数無しの関数ポインタ的な取り扱いの感覚でコーディングしてしまった)
//Func(true.IsTrue);
よくよく考えれば、上記のような拡張メソッドは以下の関数と同等であると考えれば
エラーとなるのも納得できる。
//拡張メソッドは、以下と同等の為、引数無しデリゲート型として渡せないと思われる。//Func(TestExt.IsTrue(true));
なので、下記の様にすれば問題はない。
//以下は可能Func(()=>true.IsTrue());Func(IsTrue_Func);
追記:
また、紛らわしい内容だったかもしれないので捕捉しますと、
当然、以下の内容で回避できます。
(@htsignさんのコメントより)
boolFunc(Func<bool,bool>func)=>func(true);Func(TestExt.IsTrue);
が、以下の様には渡せません。
//Func(true.IsTrue);//おそらく以下のように取り扱われているから?//Func(TestExt.IsTrue(true));
元々、気軽に以下の様に渡そうとしていたので、
回避策はあるにせよ、もう少し上手くコンパイラが立ち回ってくれたらな
という身勝手な思いをつづってみた次第でございます。
//Func(true.IsTrue);