プロパティアクセサとスタックオーバフロー

私がC#でプログラムを書いていて、スタックオーバフローを発生させる一番の原因は、プロパティのアクセサである。というのも、私はJavaの時からの慣習で、プロパティ名の先頭文字をデキャピタライズした名前をフィールド名にするからだ。あと、この名前付けに則ると自然なのだが、フィールド名を参照する場合は明示的になるように自らを参照するthisを必ず付加する。

private string hoge;
public string Hoge
{
    get { return this.hoge; }
    set { this.hoge = value; }
}

とまあ、このような名前付けのルールでプロパティを書くと、インテリセンスの素早い補完により、以下のように書いてしまうことがままある。(書いている時は気が付かなかったりするのがやっかいだ)

private string hoge;
public string Hoge
{
    get { return this.Hoge; }
    set { this.Hoge = value; }
}

これでスタックオーバフローを起こすコードの完成だ。
素朴な疑問だが、プロパティのアクセサはコンパイルすると内部では get_Hoge、set_Hogeというメソッドに変換されるが、その時点で、どうしてコンパイラ側でプロパティ名が循環参照していることを検知できないのだろう。これを検知してくれるだけで、C#のスタックオーバフローの9割は排除できるのだが。

あと、この慣れた書き方に関してだが、アセンブリに属性CLSCompliant=trueを指定していると、IDEから「警告 CS3005: 大文字、小文字の違いのみの識別子 'hoge' は CLS に準拠していません。」って怒られるし、更にReSharperには「this.〜っていちい記述するのは冗長だからやめれ」と文句を言われる。個人的にはフィールド名を"m_hoge"とかにするほうが抵抗があるし、デキャピタライズしたフィールド名を参照する場合には"this."を付けないと気持ちが悪い。困ったものだ。