C#开发学习~~~“未能找到类型或命名空间名称“XXXX”(是否缺少 using 指令或程序集引用?)”

引言

在《C#高阶编程》(中文第10版)的2.2.4节中,有这样一段描述:
出自《C#高阶编程》(中文第10版2.2.4节看到这段话,我简单的理解为,只要在程序开始用using语句声明名称空间,就可以在当前名称空间使用声明的这个名称空间中的类和方法,但实践证明我的理解是有些错误的T0T

问题与解决

首先,创建两个项目,分别是RectangleApplication和HelloWordApplication
在这里插入图片描述
源码如下:

  • RectangleApplication—Program.cs,这里定义了名为“RectangleApplication”的名称空间,并创建 Rectangle类和 Area类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace RectangleApplication
{
    class Rectangle
    {
        double width;
        double length;
        double area;//成员变量

        public void getDetails()
        {
            width = 2.8;
            length = 3.1;
        }//成员方法
        public double getArea()
        {
            area = width * length;
            return area;
        }//成员方法
        public void show()
        {
            Console.WriteLine("Witdh:{0}", width);
            Console.WriteLine("Length:{0}", length);
            Console.WriteLine("Area:{0}", getArea());
        }//成员方法
    }
    class Area
    {
        static void Main(string[] args)
        {
            Rectangle r = new Rectangle();
            r.getDetails();
            r.show();
            Console.ReadKey();
        }
    }
}

可以正常编译运行,结果是:
在这里插入图片描述

  • HelloWordApplication—Program.cs,在这里,使用using语句声明“RectangleApplication”这个名称空间,并且在main()方法中调用“RectangleApplication”名称空间中的类与方法。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using RectangleApplication;

namespace HelloWordApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            Rectangle r = new Rectangle();
            r.getDetails();
            r.show();
            Console.WriteLine("成功运行了!");
            Console.ReadKey();
        }
    }
}

执行报错,如图:
在这里插入图片描述
在using语句中声明了名称空间,但却没有成功引用该名称空间的类,在网上找到解决方法如下:
在项目的展开目录下,有一个“引用”目录,右键点击,选择“添加引用”,进入【引用管理器】,因为这里是引用同一解决方案中的另一项目的命名空间,所以选择相应的项目(RectangleApplication)就好,点击“确定”。
引用管理其此时,using已经不再报错,但是又出现了新的错误,如图:
在这里插入图片描述
原因是,在namespace中的类、接口默认是internal访问类型的,只允许同一程序集文件中的成员访问,如果要让另一程序集访问,须显示的将该类访问类型定义为public。如下:
在这里插入图片描述
至此,不再报错,HelloWordApplication项目可以正常运行,运行结果如下:
HelloWordApplication运行结果

问题积累

  • 项目目录中的“引用”和代码中的using有什么区别?
    在项目目录中的“引用”中添加某一程序集(库文件)或者项目后,该项目就可以使用这一程序集中的内容了,包括访问权限许可的类、方法等。
    而using则方便我们使用引用了的程序集,因为一个程序集下有一个或者多个名称空间,使用using可以对其中某一名称空间进行引入,与此同时,也简化了我们的代码,当在代码中需要用到引用的程序集中的某一方法时,如果使用using语句引入了方法所在的名称空间,我们在使用方法时只需写类.方法即可,否则就还需要在这前面加上冗长的名称空间,非常不方便。
    总之using引入名称空间成功的前提是在项目的“引用”中添加了该名称空间所在的程序集

  • C#默认访问权限(部分)
    1.在namespace中的类、接口默认是internal类型的,可以显示的定义为public类型,但不允许是其他访问类型。
    2.在一个类里面,变量和方法默认是private的,可以显示的定义为public、private、protected、internal或protected internal等访问类型。
    3.接口中不能定义成员变量,接口中的方法访问权限默认且只能为public,不能显示的定义任何访问类型。
    4.抽象类中抽象方法可以是public、internal、protected,不能是private的访问类型。
    5.类中所有的成员,默认均为private。

    C#中的访问修饰符:

    下表引用自《C#高级编程(中文第10版)4.4.1 访问修饰符
    图片来自《C#高级编程(中文第10版)4.4.1 访问修饰符》补充:微软官方C#指南 中,新增一种访问修饰符如下:
    private protected 访问限于同一程序集中的包含类或派生自包含类的类


版权声明:本文为amaoagou_0124原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。