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

Ошибка С#, когда класс разделяет имя с пространством имен

Сборка 1

namespace Foo
{
    public class Foo { }
}

Сборка 2

using Foo;

public class Bar 
{ 
    Foo foo = new Foo();
}

Сегодня я обнаружил, что приведенное выше дает ошибку Type name expected but namespace name found.

Я нахожу это удивительным. Насколько мне известно, вы не можете объявить переменную пространства имен или новое() пространство имен. Foo - это тип, и он используется, когда парсер ожидает найти тип, поэтому почему анализатор не может правильно его решить? На какой языковой функции я упускаю из виду, что означает, что команда компилятора не смогла это реализовать?

4b9b3361

Ответ 1

Eric Lippert в блогах (части one; two; three; four) дают хорошее представление об этом. Из первой части:

Это показывает интересный момент о дизайне алгоритма "привязки типа" в С#. То есть, алгоритм, определяющий тип или пространство имен, называется "X.Y". Мы не "отступаем". Мы не говорим "хорошо, предположим, что X означает это. Тогда Y не имеет смысла. Давайте отступим, предположим, что X означает это другое, о, да, тогда Y имеет значение". Мы выясняем, что X однозначно означает, и только тогда мы выясним, что означает Y. Если X неоднозначно, мы не проверяем все возможности, чтобы увидеть, есть ли у кого из них Y, мы просто сдаемся.

Здесь у нас есть только X, но я думаю, что компилятор пытается выяснить, означает ли это пространство имен или тип, прежде чем проверять, есть ли что-нибудь еще после него.

Лично я не против этого ограничения. Это означает, что вам не рекомендуется писать код с пространством имен и классом, называемым одним и тем же, - и, как та путающая ситуация с человеческой точки зрения, я рад за то, что он обескуражен.