Подтвердить что ты не робот

Почему имена участников С# не могут быть такими же, как имя типа вложения?

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

class Foo {

    public string Foo;

}

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

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

имена участников не могут быть такими же, как и их закрывающий тип

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

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

4b9b3361

Ответ 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. Абстракция делает код более понятный. Я думаю, что аргумент работает на том же уровне, что и множественное наследование. Да, это может быть сделано на некоторых языках, но это вызывает путаницу. Поэтому мой ответ заключался бы в том, чтобы уменьшить двусмысленность и путаницу и основываться на парсере/компиляторе С#. Выбор дизайна командой С#.