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 类不起作用