Почему я не могу использовать частично определенные пространства имен во время инициализации объекта?
Я подозреваю, что это вопрос, который задавался много раз прежде, но я не нашел его.
Я обычно использую полностью определенные пространства имен, если я не часто использую этот тип в файле или добавляю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