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 した型と一致しなければ,コンパイルエラーになります.これでコンパイラを通さなくても,コンパイルが通るコードがチェックインされていることさえ分かっていれば,ソースを読むだけで戻り値の型が分かります.
まあこの例の場合,視覚的には完全に失敗といっていいでしょうけどね.