Доброго времени суток!
Есть решение под названием RiskAssessment
. В нем есть 2 проекта:
1) RiskAssessment.User, в котором находится файл User.cs
2) RiskAssessment.Risk, в котором находится файл Risk.cs
Risk.cs:
using System;
namespace RiskAssessment.Risk
{
public class Risk
{
//SomeContent
}
}
User.cs:
using System.Collections.Generic;
using RiskAssessment.Risk;
namespace RiskAssessment.User
{
public class User
{
List<Risk> risks;
}
}
Код файла User.cs
не будет компилироваться, потому как для обращения к типу Risk
требуется следующая ссылка:
List<RiskAssessment.Risk.Risk> risks;
// или
List<Risk.Risk>
Почему нельзя обратиться к типу Risk
, используя просто Risk
? Как исправить наименования пространств имен, чтобы доступ к типу Risk
был через Risk
, а не через Risk.Risk
. Помогите пожалуйста разобраться с этим.
Проблема в том, что у вас пространство имён (namespace) и класс имеют одинаковое имя. Это не рекомендуется по многим причинам.
Попробуйте, например, так:
namespace RiskAssessment.RiskObjects
{
public class Risk
{
//SomeContent
}
}
using RiskAssessment.RiskObjects;
namespace RiskAssessment.UserObjects
{
public class User
{
List<Risk> risks;
}
}
Дело в том, что алгоритм поиска имён в C# сначала ищет Risk
в RiskAssessment.User
(и не находит), затем идёт наружу и ищет в RiskAssessment
. Там он находит User
, но это namespace, так что он не ищет дальше, а выдаёт ошибку.
До рассмотрения using
дело даже не доходит.
(Точный алгоритм поиска описан в спецификации языка, раздел 3.8.)
Обновление: Внимательно перечитав алгоритм разрешения имён, я нашёл ещё одно решение, которое работает без переименования:
namespace RiskAssessment.User
{
using RiskAssessment.Risk; // <-- *внутри*
public class User
{
List<Risk> risks;
}
}
Здесь алгоритм разрешения имён «видит» имя класса Risk
, так как оно импортировано во внутреннее пространство имён RiskAssessment.User
, и таким образом до «спуска» в пространство имён RiskAssessment
дело не доходит.
Тем не менее, всё же совпадающее имя пространства имён и класса — не самая хорошая вещь, так что возможно переименование пространства имён всё же лучше.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Есть класс с перечислением:
Допустим, есть некоторая коллекция объектов одного типа и хотел бы получать события от каждого объекта
Привет, друзьяНадеюсь Вы мне поможете, потому что я только начинающий в C#