Quantcast
Channel: C#タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 9297

[C#] 拡張メソッドは、引数無しデリゲート型として関数に渡せない

$
0
0

わかる人にとっては、当たり前といえば当たり前だが、
地味に時間を使ってしまったので、備忘録としてメモしておく。

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);

Viewing all articles
Browse latest Browse all 9297

Trending Articles