C#のインデクサはコンパイルするとItemという識別子で実装される。つまり名前が衝突する箇所に別のItemがあるとコンパイルエラーになる。しかしエラーメッセージはそんな状況を親切丁寧には説明はしてくれない。

下線位置はthisである。そしてclass Aどこをどう見てもItemという識別子はintの定義一つだけである。どうして匿名メソッドようにユーザーが絶対に定義できないような暗号のような識別子を生成しないのだろう?
これはまあ想像するしかないのだが、私が昔まだVB6をいじっていた頃、そういえばデフォルトのインデクサ的プロパティは必ずItemだった。なのでMicrosoft的におよそデフォルトのインデクサはItemという識別子で統一するという決まりがあるのだろう。とりあえず2年以上C#やってて今日初めてこれを知った。結構知らない人は多いんじゃないかと思った。