Пространства имен не распознаются

У меня есть следующий класс

namespace _Scripts.EnemyStuff
{
    public class Enemy : MonoBehaviour, IDamagable
    {
    }
}

И затем, когда я пытаюсь использовать класс Enemy, мне нужно указать, что он исходит от _Scripts.EnemyStuff, даже если они имеют одного и того же родителя.

Следующий код не обнаруживает класс Enemy. Мне нужно указать EnemyStuff.Enemy, чтобы заставить его работать.

namespace _Scripts.Managers
{
    public class EnemyManager : MonoBehaviour
    {
        public Enemy firstEnemyGO;
    }
}

Почему это происходит? Кроме того, почему это не работает, если я использую

using Enemy = _Scripts.EnemyStuff.Enemy;

просто добавьте using _Scripts.EnemyStuff; в начало вашего EnemeyManager-скрипта.

MakePeaceGreatAgain 31.10.2022 13:27

что вы подразумеваете под "даже если у них один и тот же родитель"?

MakePeaceGreatAgain 31.10.2022 13:28

добавление события using_Scripts.EnemyStuff не работает, по какой-то причине компилятор обнаруживает дубликат этого класса, даже если существует только 1

D4rWiNS 31.10.2022 13:28

Я имею в виду, что даже если я помещу оба класа в одно и то же пространство имен _Scripts, он не определит его правильно.

D4rWiNS 31.10.2022 13:31

У вас есть два класса с именем Enemy?

MakePeaceGreatAgain 31.10.2022 13:32

C# находит класс в родительском пространстве имен, но не в родственном пространстве имен. Вы разместили using Enemy = _Scripts.EnemyStuff.Enemy; в сценарии менеджеров?

Olivier Jacot-Descombes 31.10.2022 13:32

Пожалуйста, предоставьте минимальный воспроизводимый пример. В настоящее время мы можем только догадываться, поскольку у нас нет всей необходимой информации.

MakePeaceGreatAgain 31.10.2022 13:42
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В общем, вы всегда должны точно определить, какой тип вы имеете в виду. Я бы предпочел видеть это наоборот, и есть определенные случаи, когда С# уже «знает», поэтому вы можете опустить пространства имен или их части. Среди них, например.

  • Если у вас есть using XYNamespace;, теперь вы можете опустить XYNamespace. при обращении к типам внутри него.
  • Если ваш тип находится в том же пространстве имен или в его подпространстве

См. также пространства имен

иметь одного и того же родителя

Они не очень! Ваша иерархия пространства имен выглядит так

_Scripts
|-- EnemyStuff
|   |-- Enemy
|
|-- Managers
    |-- EnemyManager
    

c# ищет тип рекурсивно вверх по родительскому пути (_Scripts.Managers.XY или _Scripts.XY), но не всплывает обратно вниз по всем возможным пространствам имен того же уровня.

Так что да, в этой структуре вам нужно будет указать пространство имен и использовать, например.

public EnemyStuff.Enemy firstEnemyGO;

EnemyStuff на самом деле можно найти в общем родительском пространстве имен _Scripts, поэтому вы можете опустить _Scripts.


Либо

using System;
using UnityEngine;
using Enemy = _Scripts.EnemyStuff.Enemy;

namespace _Scripts.Managers
{
    public class EnemyManager : MonoBehaviour
    {
        public Enemy firstEnemyGO;
    }
}

или

using System;
using UnityEngine;

namespace _Scripts.Managers
{
    using Enemy = EnemyStuff.Enemy;
    
    public class EnemyManager : MonoBehaviour
    {
        public Enemy firstEnemyGO;
    }
}

или

using System;
using UnityEngine;

namespace _Scripts.Managers
{
    public class EnemyManager : MonoBehaviour
    {
        public EnemyStuff.Enemy firstEnemyGO;
    }
}

отлично работает для меня

Другие вопросы по теме