You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

C#技术咨询:未引用命名空间为何仍能访问对应类?

为什么未引入命名空间仍能访问Character类?

嘿,这个问题其实涉及到C#命名空间的一个实用特性——当你的代码所在的命名空间是目标类型命名空间的子命名空间时,不需要显式添加using指令就能直接访问父命名空间里的公开类型

咱们结合你的代码来具体看:

  • 你的Character类在MagicDestroyers.CharacterNS命名空间下
  • Melee类的命名空间是MagicDestroyers.CharacterNS.MeleeNS

很明显,Melee的命名空间是Character所在命名空间的子命名空间(类比文件系统里的父文件夹和子文件夹)。C#编译器会自动向上查找父命名空间里的公开类型,所以你不需要写using MagicDestroyers.CharacterNS;也能继承Character

你可以做个小测试验证

要是把Melee的命名空间改成完全不相关的,比如MagicDestroyers.RandomNS,这时候编译器肯定会报错找不到Character类型,必须加上using MagicDestroyers.CharacterNS;才能正常编译。

额外提醒两点

  1. 这个特性只生效于同一项目内的类型,要是Character在另一个项目里,哪怕命名空间是父子关系,你也得先引用那个项目,再写using指令才能访问。
  2. 父命名空间里的类型必须是public的(你的Character正好满足这个条件),如果是内部类型(internal),就算是子命名空间也没法直接访问。

你的代码示例

Character.cs

using System;
using MagicDestroyers.WeaponNS.SharpNS;
using MagicDestroyers.EnumerationNS;
using MagicDestroyers.ArmorNS.MailNS;
namespace MagicDestroyers.CharacterNS
{
    public class Character
    {
        private static int idCounter;
        private int abilityPoints;
        private int healthPoints;
        private int level;
        private int damage;
        private ChainLink bodyArmour;
        private Sword weapon;
        public ChainLink BodyArmour { get => bodyArmour; set => bodyArmour = value; }
        public Sword Weapon { get => weapon; set => weapon = value; }
        //... 其他省略代码
    }
}

Melee.cs

namespace MagicDestroyers.CharacterNS.MeleeNS
{
    // 无需引入MagicDestroyers.CharacterNS也能访问Character类
    //using MagicDestroyers.CharacterNS;
    public class Melee : Character
    {
    }
}

内容的提问来源于stack exchange,提问作者Vikram Singh

火山引擎 最新活动