Иногда полезно иметь что-то вроде:
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 является типом, и поэтому может понять его так же, как в первом примере?
Краткая версия: Почему работает первый пример, но не второй?
EDIT: Я только что обнаружил, что если я "Рефакторинг > Переименуйте" параметр типа, скажем, от T до U, среда IDE изменит его на:
class Z<U> {
  U T {
    get { ... }
    set { ... }
  }
}
поэтому что-то там знает, какой тип и какое имя участника
