Почему имена членов C# не могут совпадать с именем заключительного типа?


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

class Foo {

    public string Foo;

}

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

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

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

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

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

4 51

4 ответа:


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

Public Class Class1
    Public Sub Class1()

    End Sub
End Class

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

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

потому что Foo-это зарезервированные в качестве имени конструктора.

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

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

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

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

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

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

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