Страницы

Поиск по вопросам

понедельник, 28 января 2019 г.

C#. Вопрос по работе с пространствами имен

Доброго времени суток!
Есть решение под названием 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 risks; } }
Код файла User.cs не будет компилироваться, потому как для обращения к типу Risk требуется следующая ссылка:
List risks; // или List
Почему нельзя обратиться к типу Risk, используя просто Risk? Как исправить наименования пространств имен, чтобы доступ к типу Risk был через Risk, а не через Risk.Risk. Помогите пожалуйста разобраться с этим.


Ответ

Проблема в том, что у вас пространство имён (namespace) и класс имеют одинаковое имя. Это не рекомендуется по многим причинам
Попробуйте, например, так:
namespace RiskAssessment.RiskObjects { public class Risk { //SomeContent } }

using RiskAssessment.RiskObjects;
namespace RiskAssessment.UserObjects { public class User { List risks; } }

Дело в том, что алгоритм поиска имён в C# сначала ищет Risk в RiskAssessment.User (и не находит), затем идёт наружу и ищет в RiskAssessment. Там он находит User, но это namespace, так что он не ищет дальше, а выдаёт ошибку.
До рассмотрения using дело даже не доходит.
(Точный алгоритм поиска описан в спецификации языка, раздел 3.8.)

Обновление: Внимательно перечитав алгоритм разрешения имён, я нашёл ещё одно решение, которое работает без переименования:
namespace RiskAssessment.User { using RiskAssessment.Risk; // <-- *внутри*
public class User { List risks; } }
Здесь алгоритм разрешения имён «видит» имя класса Risk, так как оно импортировано во внутреннее пространство имён RiskAssessment.User, и таким образом до «спуска» в пространство имён RiskAssessment дело не доходит.
Тем не менее, всё же совпадающее имя пространства имён и класса — не самая хорошая вещь, так что возможно переименование пространства имён всё же лучше.

Комментариев нет:

Отправить комментарий