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

210
17 апреля 2017, 02:42

Доброго времени суток!

Есть решение под названием 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. Помогите пожалуйста разобраться с этим.

Answer 1

Проблема в том, что у вас пространство имён (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 дело не доходит.

Тем не менее, всё же совпадающее имя пространства имён и класса — не самая хорошая вещь, так что возможно переименование пространства имён всё же лучше.

READ ALSO
Работа с множеством событий от объектов одного типа

Работа с множеством событий от объектов одного типа

Допустим, есть некоторая коллекция объектов одного типа и хотел бы получать события от каждого объекта

186
C# Получение значения из List

C# Получение значения из List

Привет, друзьяНадеюсь Вы мне поможете, потому что я только начинающий в C#

252