30

我对 C# 很陌生,并且已经创建了一个我想在我的主类中使用的类。这两个类位于不同的文件中,但是当我尝试使用 将一个导入另一个时using,cmd 说

找不到类型或命名空间名称“MyClass”(您是否缺少 using 指令或程序集引用?

我知道在Java中我必须搞砸CLASSPATH才能让这样的事情起作用,但我对C#一无所知。

额外细节:

您可能已经知道,我正在通过命令提示符编译和执行。/target:library我正在使用(我听说只有主类应该是 .exe 文件)编译我的非主类。

我的代码如下所示:

public class MyClass {
    void stuff() {

    }
}

和我的主要课程:

using System;
using MyClass;

public class MyMainClass {
    static void Main() {
        MyClass test = new MyClass();
        /* Doesn't work */
    }
}

我试图将我的非主类包含namespace MyNamespace { }并导入它,但它也不起作用。

4

8 回答 8

43

更新:从 C# 6 开始,如果要使用类的静态成员而不指定类名,可以使用using static 指令将静态成员导入当前范围,如下所示:

using static MyNamespace.MyClass;

尽管这不是最初的问题,但您会收到与 OP 得到的类似的错误,因此我提供它是为了完整性。

回答OP的问题

using仅用于命名空间 - 如果两个类都在同一个命名空间中,只需删除using.

编译 .exe 时必须引用第一步中创建的程序集:

csc /t:library /out:MyClass.dll MyClass.cs
csc /reference:MyClass.dll /t:exe /out:MyProgram.exe MyMainClass.cs

如果您只是将文件编译在一起,您可以使事情变得更简单:

csc /t:exe /out:MyProgram.exe MyMainClass.cs MyClass.cs

或者

csc /t:exe /out:MyProgram.exe *.cs

编辑:这是文件的样子:

MyClass.cs

namespace MyNamespace {
    public class MyClass {
        void stuff() {
 
        }
    }
}

MyMainClass.cs

using System;

namespace MyNamespace {
    public class MyMainClass {
        static void Main() {
            MyClass test = new MyClass();
        }
    }
}
于 2013-02-06T12:15:11.693 回答
30

我知道这是一个非常古老的问题,但我有同样的要求,只是发现在 c#6 之后你可以使用静态来导入类。

我希望这可以帮助别人....

using static yourNameSpace.YourClass;
于 2016-12-16T07:58:13.660 回答
5

那么你必须“导入”(使用)的是MyClass不是类名本身的命名空间。如果两个类都在同一个命名空间中,则不必“导入”它。

定义MyClass.cs

namespace Ns1
{
    public class MyClass
    {
        ...
    }
}

用法AnotherClass.cs

using Ns1;

namespace AnotherNs
{
    public class AnotherClass
    {
        public AnotherClass()
        {
            var myInst = new MyClass();
        }
    }
}
于 2013-02-06T11:55:59.050 回答
2

如果它们是同一个项目中的单独类文件,那么您不需要有“import”语句。直接使用类。如果文件位于不同的项目中,则需要先添加对该项目的引用,然后才能对其使用“导入”语句。

于 2013-02-06T11:59:35.687 回答
2

如果另一个类被编译为库(即 dll)并且这是您想要的方式,您应该添加来自 Visual Studio 的引用,浏览并指向 dll 文件。

如果您想要将 OtherClassFile.cs 合并到您的项目中,并且命名空间已经相同,您可以:

  1. 关闭您的解决方案,
  2. 打开 YourProjectName.csproj文件,然后查找此部分:

    <ItemGroup>                                            
        <Compile Include="ExistingClass1.cs" />                     
        <Compile Include="ExistingClass2.cs" />                                 
        ...
        <Compile Include="Properties\AssemblyInfo.cs" />     
    </ItemGroup>
    
  1. 检查您要添加的 .cs 文件是否位于项目文件夹中(与解决方案中的所有现有类相同的文件夹)。

  2. 如下在里面添加一个条目,保存并打开项目。

    <Compile Include="OtherClassFile.cs" /> 
    

您的班级现在将作为项目的一部分出现并运行。不需要使用。这可以一次完成多个文件。

于 2013-12-08T13:17:28.240 回答
1

MyClass是一个而不是一个命名空间。所以这段代码是错误的:

using MyClass //THIS CODE IS NOT CORRECT

您应该检查MyClass(例如:MyNamespace)的命名空间。然后以适当的方式调用它:

MyNamespace.MyClass myClass =new MyNamespace.MyClass();
于 2013-02-06T11:56:57.830 回答
1

using用于导入命名空间而不是类。

所以如果你的类在命名空间中X

namespace X
{
    public class MyClass {
         void stuff() {

         }
    }
}

然后在您想要的另一个名称空间中使用它

using System;
using X;

public class MyMainClass {
    static void Main() {
        MyClass test = new MyClass();
    }
}
于 2013-02-06T11:57:11.357 回答
0
namespace MyNamespace
{
    public class MyMainClass
    {
        static void Main()
        {
            MyClass test = new MyClass();
        }
    }

    public class MyClass
    {
        void Stuff()
        {

        }
    }
}

你不需要使用命名空间,因为它都包含在同一个命名空间中。

如果您不确定您的类位于哪个命名空间,请键入该类(您希望使用区分大小写),然后将光标放在该类上,使用CTRL+ .,它将为您提供手动导入。

于 2013-02-06T11:56:37.473 回答