C#将类导入另一个类不起作用

Posted

技术标签:

【中文标题】C#将类导入另一个类不起作用【英文标题】:C# importing class into another class doesn't work 【发布时间】:2013-01-21 14:42:40 【问题描述】:

我对 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 包含我的非主类并导入它,但它也不起作用。

【问题讨论】:

在编译主类时,您确实将生成的库作为输入传递给编译器,对吧?此外,您应该能够将两个源文件一起传递给编译器 - 这里不需要库。 您是否将另一个文件(MyClass 所在的文件)添加到 Visual Studio 的解决方案中? @JensKloster 什么解决方案?什么视觉工作室?我没有使用 IDE,我使用的是命令提示符。 @Alex 我该怎么做? :o 为什么要从命令行编译?第一个类被编译成一个 DLL 文件。当您编译第二个程序集(使用MyMainClass)时,您必须引用第一个程序集。如果您使用 Visual Studio 中的 C# 项目文件 (*.csproj),请右键单击“引用”、“添加引用...”,然后指向第一次编译中的 DLL。如果您不使用csproj-files,请使用/r compiler option。 【参考方案1】:

更新:从 C# 6 开始,如果你想使用类的静态成员而不指定类名,你可以使用using static directive 来导入将静态成员放入当前作用域,如下所示:

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();
        
    

【讨论】:

但是当我将它们都放在同一个命名空间中时,当我尝试使用它时,它给了我完全相同的错误。 @Bluefire 发布用于编译它们的命令行和文件内容,包括命名空间。 最佳答案,因为它实际上提供了用于编译的命令行。原始海报必须决定他是否想要两个单独的程序集中的类(将一个类编译为库 (DLL),然后参考第一次编译的 DLL 将第二个类编译为可执行文件)还是只在一个程序集中(使用两个文件编译一次)。这是许多人通过在 Visual Studio 中拥有“项目”来管理的事情,其中​​项目相互引用(以非循环方式)并且每个项目可以包含一个或多个代码文件。【参考方案2】:

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

我希望这对某人有所帮助....

using static yourNameSpace.YourClass;

【讨论】:

如果您想从 yourNameSpace.YourClass 隐式导入所有公共字段,这应该是正确的答案。这是我的需要。【参考方案3】:
namespace MyNamespace

    public class MyMainClass
    
        static void Main()
        
            MyClass test = new MyClass();
        
    

    public class MyClass
    
        void Stuff()
        

        
    

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

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

【讨论】:

【参考方案4】:

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

定义MyClass.cs

namespace Ns1

    public class MyClass
    
        ...
    

使用AnotherClass.cs

using Ns1;

namespace AnotherNs

    public class AnotherClass
    
        public AnotherClass()
        
            var myInst = new MyClass();
        
    

【讨论】:

【参考方案5】:

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

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

    关闭您的解决方案,

    打开 YourProjectName.csproj 文件,然后查找此部分:

    <ItemGroup>                                            
        <Compile Include="ExistingClass1.cs" />                     
        <Compile Include="ExistingClass2.cs" />                                 
        ...
        <Compile Include="Properties\AssemblyInfo.cs" />     
    </ItemGroup>
    

    检查您要添加的 .cs 文件是否在项目文件夹中(与解决方案中所有现有类相同的文件夹)。

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

    <Compile Include="OtherClassFile.cs" /> 
    

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

【讨论】:

我遇到了同样的问题,并在 VS 右侧的解决方案中添加了新类,但它与其他类的显示不同。我像他说的那样打开了csproj,它看起来并不异常。我重新打开了我的 VS 项目,它在项目的右侧看起来很正常,就像其他类一样。现在它被我的项目识别了。【参考方案6】:

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

【讨论】:

【参考方案7】:

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

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

namespace X

    public class MyClass 
         void stuff() 

         
    

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

using System;
using X;

public class MyMainClass 
    static void Main() 
        MyClass test = new MyClass();
    

【讨论】:

【参考方案8】:

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

using MyClass //THIS CODE IS NOT CORRECT

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

MyNamespace.MyClass myClass =new MyNamespace.MyClass();

【讨论】:

以上是关于C#将类导入另一个类不起作用的主要内容,如果未能解决你的问题,请参考以下文章

发布应用程序时,代码后面的 C# Asp.net Css 类不起作用

将类添加到按钮后功能不起作用

导入另一个文件时,Apollo 反应变量不起作用!为啥?

切换类不起作用

Router and canActivate类不起作用。未找到指令

pyinstaller .exe 文件在导入另一个模块后不起作用