以前、[C#]XElementから属性値を簡単に取るという記事で、「拡張メソッドで定義すればXElementを目的の型に簡単に変換できるよ」と書いたのだが、「単純にキャストしたらどうでしょうか」というコメントを頂いた。
XElementやXAttributeは、なんと、intやstringにダイレクトにキャストできる。
XAttribute attr = new XAttribute("name", "value"); XAttribute intattr = new XAttribute("name", "123"); XElement elem = new XElement("name", "value"); int intValue = (int)intattr; string attrString = (string)attr; string elemString = (string)elem; Debug.WriteLine(intValue + 1); // outputs 124 Debug.WriteLine(attrString); // outputs "value" Debug.WriteLine(elemString); // outputs "value"
XElementとかXAttributeからダイレクトにキャストできるってどういうこと!?どういう仕組になってんの!?とその時はとても驚き、まあ、このクラスだけ特殊扱いするような言語仕様になってんだろ、と無理やり納得させていたのですが、それでも「たかがこれだけのためにわざわざXElementとXAttributeを特別扱いするかな・・・」という疑念があり、モヤモヤしたままでいた。
でも、今日、explicitという機能があることを知った。
そ、そうなんだ・・・。キャスト演算子ってユーザー定義出来るんだ・・・。知らなかった。ちなみに、暗黙的なキャストもユーザー定義できちゃうみたい。
でもまあ知ったところであまり使い道の無い機能ですね。何も考えずに使うとコードの可読性を大きく損なってしまう。とくにimplicitとか、怖くて私は使えません。
ちなみに私の個人的な意見ですが、XElementからintやstringにキャストできてしまうのすら、「ちょっとやり過ぎでは?」と思います。XMLの「属性」や「要素」という概念がいきなりintとかstringとかいう単純な値に落ちてしまってるのに違和感がある。
が、便利なので普通に使うし、もっと言うと、そういうC#の理想よりも実用重視な設計が結構好きです。車で言えばC#は軽トラ。
いいね! 1+