2008年06月25日

if (Hoge()) はエラー?

  
問題です。

C#で、

if (Hoge()) { Console.WriteLine("Hoge() == true") ;}

がコンパイルエラーで、

if (Hoge() == true) { Console.WriteLine("Hoge() == true"); }

が、コンパイルエラーにならないって、どんな場合でしょうか?


この記事へのコメント
コメント欄で解答していいのかな?と思いつつ…


Hoge() メソッドが返すオブジェクトが、true 演算子および false 演算子をオーバーロードしておらず、== のみをオーバーロードしている、という状況でしょうか。
勘ですが(^^;;
Posted by いげ太 at 2008年06月25日 23:18
いげ太さん、

なるほど、そういう場合もありますね。
ということで、正解!

ですが、僕が考えていたのは、違うものです。
正解は2つある、ということかな。

Posted by Gushwell at 2008年06月25日 23:39
わかったー、Nullable ですね

static bool? Hoge() { return true; }
Posted by よこけん at 2008年06月26日 00:33
よこけんさん

はい、正解でーす。 (^ ^/
これで、コンパイルエラーになったときに、
どうやって、エラーを無くそうか、悩みました。
でも分かってしまえば、何のことはなかったです。

Posted by Gushwell at 2008年06月26日 07:32
ちらちら調べてみたんですが案外奥が深くてびっくりしました、Nullable。
== の代わりに、GetValueOrDefault でもいけそうですね。
# それじゃクイズにならないから == を使われたんでしょうけれど(^^;

if (Hoge().GetValueOrDefault()) { Console.WriteLine("Hoge() == true"); }

この辺は好みの問題でいいんですかねー?
Posted by いげ太 at 2008年06月30日 19:53
いげ太 さん
ホントNullable奥が深いですね。
好みの問題で良いんじゃないでしょうか?
でも、分かりやすさでは、 == かなと思います。

?? 演算子を使うっていう手もありますよね。

Posted by Gushwell at 2008年06月30日 21:21
個人的には ?? が好みです。一目見て Nullable 型への演算だとわかるし、
どんどこ結合していける感じがカッコイイ(謎)。でもそれじゃあ OOP っぽくない
じゃん、多態使おうぜ多態、って方向性だと== の方が美しいかもですね。

ところで、?? 演算子って、最後の項だけ Nullable<T> か T かを置けるのですね。
そして、その最後の項によって、戻り値が Nullable<T> か T かに決定される。
なんだか気持ち悪いというか、奇妙な動きをするんですね。気になって調べて
みたけど、オーバーロードできるかどうかすら掲載されていないという。。

http://msdn.microsoft.com/ja-jp/library/8edha89s.aspx
http://msdn.microsoft.com/ja-jp/library/6a71f45d.aspx
Posted by いげ太 at 2008年06月30日 22:49
へー、最後の項によって型が決まるってのは、知りませんでした。
面白いですね。
ありがとうございます。



Posted by Gushwell at 2008年06月30日 23:23
 

この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/gushwell/51552768