【问题标题】:C# importing class into another class doesn't workC#将类导入另一个类不起作用
【发布时间】: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

标签: c# class main


【解决方案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 合并到您的项目中,并且命名空间已经相同,您可以:

      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" /> 
        

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

      【讨论】:

      • 我遇到了同样的问题,并在 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();
          

          【讨论】:

            猜你喜欢
            • 2021-12-01
            • 2014-11-21
            • 2015-08-15
            • 1970-01-01
            • 2019-08-23
            • 2019-06-27
            • 2019-05-22
            • 2012-12-27
            • 1970-01-01
            相关资源
            最近更新 更多