Why can't C# member names be the same as the enclosing type name?

Solution 1:

Strictly speaking, this is a limitation imposed by C#, most likely for convenience of syntax. A constructor has a method body, but its member entry in IL is denoted as ".ctor" and it has slightly different metadata than a normal method (In the Reflection classes, ConstructorInfo derives from MethodBase, not MethodInfo.) I don't believe there's a .NET limitation that prevents creating a member (or even a method) with the same name as the outer type, though I haven't tried it.


I was curious, so I confirmed it's not a .NET limitation. Create the following class in VB:

Public Class Class1
    Public Sub Class1()

    End Sub
End Class

In C#, you reference it as:

var class1 = new Class1();
class1.Class1();

Solution 2:

Because Foo is reserved as the name of the constructor.

So if your code was allowed - what would you call the constructor?

Even if it was possible to do this by treating the constructor as a special case and introducing new rules into method / member binding - would it be a good idea? It would inevitably lead to confusion at some point.

Solution 3:

Because the member name clashes with the name of the class's constructor?