Почему я не могу использовать частично определенные пространства имен во время инициализации объекта?

Я подозреваю, что это вопрос, который задавался много раз прежде, но я не нашел его.

Я обычно использую полностью определенные пространства имен, если я не часто использую этот тип в файле или добавляюusing namaspacename в верхней части файла, чтобы иметь возможность писатьnew ClassName().

Но что, если была добавлена ​​только часть полного пространства имен? Почему компилятор не может найти тип и выдает ошибку?

Рассмотрим следующий класс ввложенными Пространство имен:

namespace ns_1
{
    namespace ns_1_1
    {
        public class Foo { }
    }
}

Поэтому, если я теперь хочу инициализировать экземпляр этого класса, он работает следующим образом:

using ns_1.ns_1_1;

public class Program
{
    public Program()
    {
        // works, fully qualified namespace:
        var foo = new ns_1.ns_1_1.Foo();
        // works, because of using ns_1.ns_1_1:
        foo = new Foo();
    }
}

Но следующее не работает:

using ns_1;

public class Program
{
    public Program()
    {
        // doesn't work even if using ns_1 was added
        var no_foo = new ns_1_1.Foo();
    }
}

выдает ошибку компилятора:

Не удалось найти имя типа или пространства имен 'ns_1_1' (отсутствует директива using или ссылка на сборку?)

Я полагаю, потому чтоns_1_1 рассматривается как класс, который содержит другой классFoo вместо пространства имен это правильно?

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

Вот еще один - менее абстрактный - пример того, что я имею в виду:

using System.Data;

public class Program
{
    public Program()
    {
        using (var con = new SqlClient.SqlConnection("...")) // doesn't work
        {
            //... 
        }
    }
}

редактировать: теперь я знаю, почему это кажется мне очень странным. Работает без проблем в VB.NET:

Imports System.Data

Public Class Program
    Public Sub New()
        Using con = New SqlClient.SqlConnection("...") ' no problem

        End Using
    End Sub
End Class

Ответы на вопрос(4)

Ваш ответ на вопрос