[C#]explicit

以前、[C#]XElementから属性値を簡単に取るという記事で、「拡張メソッドで定義すればXElementを目的の型に簡単に変換できるよ」と書いたのだが、「単純にキャストしたらどうでしょうか」というコメントを頂いた。

XElementやXAttributeは、なんと、intやstringにダイレクトにキャストできる。

方法 : 要素の値を取得する (LINQ to XML)

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という機能があることを知った。

explicit (C# リファレンス)

そ、そうなんだ・・・。キャスト演算子ってユーザー定義出来るんだ・・・。知らなかった。ちなみに、暗黙的なキャストもユーザー定義できちゃうみたい。

implicit (C# リファレンス)

でもまあ知ったところであまり使い道の無い機能ですね。何も考えずに使うとコードの可読性を大きく損なってしまう。とくにimplicitとか、怖くて私は使えません。

ちなみに私の個人的な意見ですが、XElementからintやstringにキャストできてしまうのすら、「ちょっとやり過ぎでは?」と思います。XMLの「属性」や「要素」という概念がいきなりintとかstringとかいう単純な値に落ちてしまってるのに違和感がある。

が、便利なので普通に使うし、もっと言うと、そういうC#の理想よりも実用重視な設計が結構好きです。車で言えばC#は軽トラ。