Почему имена членов C # не могут совпадать с именами включающего типа? - PullRequest
51 голосов
/ 02 ноября 2010

В C # следующий код не компилируется:

class Foo {

    public string Foo;

}

Вопрос: почему?

Точнее, я понимаю, что это не компилируется, потому что):

имена членов не могут совпадать с их типом включения

Хорошо, хорошо.Я понимаю, что я не буду делать это снова, я обещаю.

Но я действительно не понимаю почему компилятор отказывается принимать любое поле, имя которого совпадает с типом включения,Что является основной проблемой, которая мешает мне сделать это?

Ответы [ 4 ]

48 голосов
/ 02 ноября 2010

Строго говоря, это ограничение, накладываемое C #, скорее всего, для удобства синтаксиса. Конструктор имеет тело метода, но его элемент-член в IL обозначается как «.ctor», и у него есть метаданные, немного отличающиеся от нормального метода (в классах Reflection ConstructorInfo наследуется от MethodBase, а не от MethodInfo.) Я не верю есть ограничение .NET, которое не позволяет создавать элемент (или даже метод) с тем же именем, что и внешний тип, хотя я не пробовал.


Мне было любопытно, поэтому я подтвердил, что это не ограничение .NET. Создайте следующий класс в VB:

Public Class Class1
    Public Sub Class1()

    End Sub
End Class

В C # вы ссылаетесь на него:

var class1 = new Class1();
class1.Class1();
19 голосов
/ 02 ноября 2010

Потому что Foo зарезервировано как имя конструктора.

Итак, если бы ваш код был разрешен - что бы вы назвали конструктором?

Даже если бы это было возможно сделать, рассматривая конструктор как особый случай и вводя новые правила в привязку метода / члена - это будет хорошей идеей? В какой-то момент это неизбежно приведет к путанице.

2 голосов
/ 02 ноября 2010

Поскольку имя члена конфликтует с именем конструктора класса?

0 голосов
/ 02 ноября 2010

Существует правильный способ сделать это и неправильный способ сделать это.

Почему C # не позволяет это?

Потому что это не причина для этого.Почему вы хотите создать такой беспорядок в вашей жизни.

Я думаю, что CLR позволяет это, как доказывает другой пост на примере vb.net, и его не следует ограничивать, но я бы не хотел создавать приложение на основе тех же правил, в которых работает CLR.Абстракция делает код более понятным.Я думаю, что аргумент работает на том же уровне, что и множественное наследование.Да, это может быть сделано на некоторых языках, но это вызывает путаницу.Поэтому мой ответ заключается в том, чтобы уменьшить двусмысленность и путаницу и основан на c # parser / compiler.Выбор дизайна командой C #.

...