Почему имена членов C# не могут совпадать с именем заключительного типа?
в C# не компилируется следующий код:
class Foo {
public string Foo;
}
вопрос: почему?
точнее, я понимаю, что это не компилируется, потому что (цитирую):
имена членов не могут совпадать с их заключительным типом
Ок, хорошо. Я понимаю это, я не буду делать это снова, я обещаю.
но я действительно не понимаю почему компилятор отказывается принимать любое поле, имеющее то же имя, что и включающий тип. Что является основной проблемой, которая мешает мне сделать это?
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#.