Ошибка C #, когда класс разделяет имя с пространством имен - PullRequest
13 голосов
/ 13 декабря 2011

Сборка 1

namespace Foo
{
    public class Foo { }
}

Сборка 2

using Foo;

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

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

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

1 Ответ

15 голосов
/ 13 декабря 2011

Сообщения в блоге Эрика Липперта (части один ; два ; три ; четыре ) дают хорошее представление об этом. Из первой части:

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

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

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

...