次のようなものがあると便利な場合があります。
class X {
...
}
class Y {
X X {
get { ... }
set { ... }
}
}
X は型が何であるか (クラス名として) と、アクセス/変更される値 (プロパティ名として) の両方を記述するためです。ここまでは順調ですね。同じことを一般的な方法で行いたいとします。
class Z<T> {
T T {
get { ... }
set { ... }
}
}
この例では、コンパイラは次のようにエラーを出しますThe type 'Z<T>' already contains a definition for 'T'
。
これはプロパティ、変数、およびメソッドで発生しますが、その理由はよくわかりません。コンパイラーは T が型であることを認識しているため、最初の例と同じ方法でそれを理解できるのでしょうか?
短いバージョン:最初の例は機能するのに、2 番目の例は機能しないのはなぜですか?
編集:型パラメーターを「リファクタリング > 名前の変更」すると、たとえば T から U に変更すると、IDE によって次のように変更されることがわかりました。
class Z<U> {
U T {
get { ... }
set { ... }
}
}
その中の何かが、何が型で何がメンバー名かを知っています