Почему имена участников С# не могут быть такими же, как имя типа вложения?
В С# следующий код не компилируется:
class Foo {
public string Foo;
}
Вопрос: почему?
Точнее, я понимаю, что это не компилируется, потому что (цитирую):
имена участников не могут быть такими же, как и их закрывающий тип
Хорошо, отлично. Я понимаю, что я не буду этого делать, я обещаю.
Но я действительно не понимаю, почему компилятор отказывается брать любое поле с тем же именем, что и закрытый тип. Какова основная проблема, которая мешает мне это сделать?
Ответы
Ответ 1
Строго говоря, это ограничение, налагаемое С#, скорее всего, для удобства синтаксиса. Конструктор имеет тело метода, но его член в IL обозначается как ".ctor", и он имеет несколько разные метаданные, чем обычный метод (в классах Reflection ConstructorInfo получается из MethodBase, а не из MethodInfo). Я не верю существует ограничение .NET, которое предотвращает создание элемента (или даже метода) с тем же именем, что и внешний тип, хотя я его не пробовал.
Мне было любопытно, поэтому я не подтвердил это ограничение .NET. Создайте в VB следующий класс:
Public Class Class1
Public Sub Class1()
End Sub
End Class
В С# вы ссылаетесь на него как:
var class1 = new Class1();
class1.Class1();
Ответ 2
Потому что Foo зарезервировано как имя конструктора.
Итак, если ваш код был разрешен - что бы вы назвали конструктором?
Даже если это можно было сделать, рассматривая конструктор как частный случай и введя новые правила в привязку метода/члена - было бы хорошей идеей? В какой-то момент это неизбежно приведет к путанице.
Ответ 3
Поскольку имя участника сталкивается с именем конструктора класса?
Ответ 4
Правильный способ сделать это и неправильный способ сделать это.
Почему С# не позволяет?
Потому что это не причина для этого. Почему вы хотите создать такую путаницу в своей жизни.
Я думаю, что CLR позволяет это, поскольку другое сообщение доказывается с помощью примера vb.net, и его не следует ограничивать, но я бы не хотел создавать приложение, основанное на тех же правилах, в которых работает CLR. Абстракция делает код более понятный. Я думаю, что аргумент работает на том же уровне, что и множественное наследование. Да, это может быть сделано на некоторых языках, но это вызывает путаницу. Поэтому мой ответ заключался бы в том, чтобы уменьшить двусмысленность и путаницу и основываться на парсере/компиляторе С#. Выбор дизайна командой С#.