type assertion
暗黙的型付け - R.Tanaka.Ichiro's Blog より.
this.SetAmount(this.GetAmount());
というコードの置き換えとして
// Type A double amount = this.GetAmount(); this.SetAmount(amount);
と
// Type B var amount = this.GetAmount(); this.SetAmount(amount);
のどっちがふさわしいかという話.
個人的には Type A と Type B のどちらでも読めないことはないので気にはなりませんが,まあ Type A でいいんじゃないでしょうか.別に深い理由はないんですが,まあ見慣れてますし,ということで.
言語が別の進化を遂げていれば,もしかしたら普段我々はこういうコードを書いていたんじゃないかと思うときがあります.
this.Order( [double] items.GetAmount(), [decimal] items.GetPrice(), [DateTime] items.GetDate() );
いわゆる型変換としてのキャストではなくて,戻り値の型の assert が可能な言語が,たまたま主流になっていてもおかしくなかったかなと.それ自体はコンパイラにとっては冗長なため,省略は可能としつつ,型が一致しなければエラーになる特殊コメント.まあ static_cast でいいじゃんって話はありそうですが.
C# 2.0 で無理矢理書くとしたら,例えばこんな感じでしょうか.メソッドルックアップルールと Obsolate 属性を使って,コンパイル時に関数戻り値の型を assert するヘルパークラスです.
public static class typeis<TAssert> { public static TAssert _(TAssert arg) { return arg; } [Obsolete("Type Assertion Failure", true)] public static TArg _<TArg>(TArg arg) { return arg; } }
使い方はこんな感じ.ちょっと (だいぶ?) みにくい子ですが.
this.Order( typeis<double>._(items.GetAmount()), typeis<decimal>._(items.GetPrice()), typeis<DateTime>._(items.GetDate()) );
assert した型と一致しなければ,コンパイルエラーになります.これでコンパイラを通さなくても,コンパイルが通るコードがチェックインされていることさえ分かっていれば,ソースを読むだけで戻り値の型が分かります.
まあこの例の場合,視覚的には完全に失敗といっていいでしょうけどね.