Sometimes it's useful to have something like:

class X {
  ...
}

class Y {
  X X {
    get { ... }
    set { ... }
  }
}

because X describes both what the type is (as a class name), and the value being accessed/mutated (as the property name). So far so good. Suppose you wanted to do the same thing, but in a generic way:

class Z<T> {
  T T {
    get { ... }
    set { ... }
  }
}

For this example, the compiler complains that: The type 'Z<T>' already contains a definition for 'T'.

This happens for properties, variables and methods, and I don't quite understand why - surely the compiler knows that T is a type and can therefore figure it out the same way as in the first example?

Short version: Why does the first example work, but not the second?

EDIT: I've just discovered that if I "Refactor > Rename" the type parameter, say from T to U, the IDE changes it to:

class Z<U> {
  U T {
    get { ... }
    set { ... }
  }
}

so something in there knows what's a type and what's a member name

Edit
Report