#c# #namespaces
#c# #пространства имен
Вопрос:
В моем решении есть один проект, направленный на предоставление некоторой базовой функциональности. Это пространство имен MyCompanyName.ProductName.FunctionSet
. На данный момент этот проект включает в себя два класса; customer.cs
и core.cs
. Основной класс является статическим и содержит статический метод EntryPoint().
У меня есть консольное приложение в решении. Его пространство имен MyCompanyName.ProductName.TaskMan
. Я создал ссылку на основной проект выше и добавил директиву using для пространства имен.
Одна из строк в Main()
является Core.EntryPoint();
. Обратите внимание, оно не включает в себя какую-либо часть пространства имен. Код работал нормально.
Теперь, чтобы устранить ошибку (не удается разрешить символ ‘EntryPoint’) Мне нужно было изменить строку на FunctionSet.Core.EntryPoint();
. Мне нужно было добавить последнюю часть пространства имен.
Зачем мне нужно было добавлять эту часть пространства имен? Есть идеи, почему это внезапно перестало работать? Могу ли я что-нибудь сделать, чтобы исключить часть пространства имен? Это не имеет большого значения, если я застрял на этом, но я действительно хочу знать, как и почему.
Комментарии:
1. Не могли бы вы включить свои
using
инструкции?2. Я предполагаю, что это потому, что оно конфликтует с другим классом, таким как Core. Попробуйте присвоить вашей ссылке псевдоним и посмотрите, работает ли это: используя fs = MyCompanyName . ProductName. Набор функций; а затем доступ к нему через fs. Ядро и т.д.
3. Я предполагаю, что вы добавили ссылку на другое пространство имен, которое также содержит класс с именем Core. (Возможно, класс .Net Framework)
Ответ №1:
РЕДАКТИРОВАТЬ: я сохранил большую часть ниже, но теперь я не уверен, что это актуально.
Я подозреваю, что одно из них верно:
- Ваши пространства имен не совсем такие, какими вы их считаете (в частности, для Core)
- У вас нет директивы using, которая, как вы думаете, у вас есть
Если бы вы могли опубликовать короткую, но полную программу (должно быть достаточно только двух классов и только пространства имен, используя директивы, объявление класса и методы — нет необходимости в какой-либо бизнес-логике), разобраться в ней было бы достаточно легко.
Пространства имен не разрешаются относительно using
директив, хотя они разрешены относительно текущего пространства имен. Например:
namespace Outer.Inner
{
class Foo
{
public static void Bar() {}
}
}
namespace Outer.OtherInner
{
class Test1
{
static void Method()
{
// Resolved to Outer.Inner.Foo.Bar()
Inner.Foo.Bar();
}
}
}
namespace OtherOuter
{
using Outer;
class Test2
{
static void Main()
{
// This is invalid
Inner.Foo.Bar();
}
}
}
Для получения полной информации смотрите раздел 3.8 спецификации C #.
Комментарии:
1. Пространство имен для Core.cs было xxx.xxx.Core. Где-то по пути мы переименовали некоторые материалы. Я не уверен, почему я не понял этого раньше. После переименования Core.cs в Test.cs проблема стала очевидной. Спасибо!
2. @SpecialAgent_W436: Базовый класс находился в основном пространстве имен? Это определенно плохая идея — см. blogs.msdn.com/b/ericlippert/archive/2010/03/09 /… и последующие части.
3. Да, именно это и произошло. Спасибо за ссылку.
Ответ №2:
Вы пробовали добавлять функцию в инструкцию using в начале файла?
using FunctionSet.Core.EntryPoint
EntryPoint();