C#常见错误及解决方案
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C#常见错误及解决方案
以下“解决方案”中的内容对应的是“错误信息”中内容的解决方法。 1. 编译器错误 CS0003 错误信息 内存不足。 解决方案 编译器无法分配足够的虚拟内存完成编译。关闭所有不必要的应用程序并重新编译。 可能还需要增加页文件的大小,请确保有可用的磁盘空间。 当 .NET Framework SDK 与 C# 编译器的版本不匹配时,或者当一个或多个支持 C# 编译器的文件损坏时,也可能出现此错误;请重新安装 Visual Studio。 2. 编译器错误 CS0012 错误信息 类型“type”在未被引用的程序集中定义。必须添加对程序集“assembly”的引用。 解决方案 未找到引用类型的定义。如果所需的 .DLL 文件没有包括在编译中,则可能发生这种情 况。 下面的编译序列将导致 CS0012: // cs0012a.cs // compile with: /target:library public class A {} 然后: // cs0012b.cs // compile with: /target:library /reference:cs0012a.dll public class B { public static A f() {
3
// CS0017, delete one Main or use /main
//
} public static void Main() { } } 在本例中, 必须在 ConditionalAttribute 外指定条件逻辑。 只能向 ConditionalAttribute 传 递一个预定义符号。 7. 编译器错误 CS0020 错误信息 被常数零除。 解决方案 表达式在除法运算的分母中使用了字面(不是变量)值零。未定义被零除,因此无效。 8. 编译器错误 CS0021 错误信息 无法将带 [] 的索引应用于“type”类型的表达式。 解决方案 试图通过索引器访问不支持 索引器(C# 编程指南) 的数据类型的值。 当您试图在 C++ 程序集中使用索引器时,可能会遇到 CS0021。在这种情况下,请用 DefaultMember 属性修饰 C++ 类,以使 C# 编译器知道哪个索引器是默认的。下面的示例 生成 CS0021。 此文件编译成一个 .dll 文件(DefaultMember 属性被注释掉)以生成此错误。 // CPP0021.cpp // compile with: /clr /LD using namespace System::Reflection; // Uncomment the following line to resolve //[DefaultMember("myItem")] public ref class MyClassMC { public: property int myItem[int] {
4
int get(int i){ return 5; } void set(int i, int value) {} } }; 下面是调用此 .dll 文件的 C# 文件。此文件试图通过索引器访问该类,但由于没有成 员被声明为要使用的默认索引器,所以生成错误。 // CS0021.cs // compile with: /reference:CPP0021.dll public class MyClass { public static void Main() { MyClassMC myMC = new MyClassMC(); int j = myMC[1]; // CS0021 } } 9. 编译器错误 CS0022 错误信息 [] 内索引数错误,应为“number”。 解决方案 数组访问操作在方括号内指定的维数不正确。 10. 编译器错误 CS0026 错误信息 关键字“this”在静态属性、静态方法或静态字段初始值设定项中无效。 解决方案 this(C# 参考) 关键字引用的对象是类型的实例。由于静态方法不依赖于包含类的任 何实例,因此“this”关键字无意义,而这是不允许的。 下面的示例生成 CS0026: 复制代码 // CS0026.cs public class A
7
// CS0029.cs public class MyInt { private int x = 0; // Uncomment this conversion routine to resolve CS0029 /* public static implicit operator int(MyInt i) { return i.x; } */ public static void Main() { MyInt myInt = new MyInt(); int i = myInt; // CS0029 } } 13. 编译器错误 CS0031 错误信息 常数值“value”无法转换为“type”。 解决方案 试图对类型不能存储值的变量赋值。 14. 编译器错误 CS0034 错误信息 运算符“operator”对于“type1”和“type2”类型的操作数具有二义性。 解决方案 运算符用在了两个对象上,并且编译器找到多个转换。转换必须是唯一的,因此需要再 进行一项类型转换,或者使其中一个转换成为显式的。
5
{ public static int i = 0; public static void Main() { // CS0026 this.i = this.i + 1; // Try the following line instead: // i = i + 1; } } 11. 编译器错误 CS0027 错误信息 关键字“this”在当前上下文中不可用。 解决方案 在属性、方法或构造函数的外部发现了 this(C# 参考) 关键字。 若要修复此错误,请修改语句以消除 this 关键字的使用,并且/或者将语句的一部分或 全部移到属性、方法或构造函数的内部。 12. 编译器错误 CS0029 错误信息 无法将类型“type”隐式转换为“type”。 解决方案 编译器要求显式转换。例如,可能需要将右值转换成与左值相同的类型。或者必须提供 转换例程以支持某些运算符重载。 在将某个类型的变量赋给其他类型的变量时必须进行转换。当在不同类型的变量之间进 行赋值时,编译器必须将赋值运算符右边的类型转换为该赋值运算符左边的类型。假设有下 面的代码: int i = 50; long lng = 100; i = lng; i = lng; 进行赋值运算,但赋值运算符左右两边变量的数据类型不匹配。进行赋值前,编 译器将变量 lng(类型为 long)隐式转换为 int。此为隐式转换,原因是没有代码显式指示
1
return new A(); } } 然后: // cs0012c.cs // compile with: /reference:cs0012b.dll class C { public static void Main() { object o = B.f(); } } 可以通过使用 /reference:b.dll;a.dll 进行编译来解决此 CS0012 错误。 3. 编译器错误 CS0014 错误信息 无法找到所需的文件“file”。 解决方案 编译器需要某个文件,但它不在系统上。请确保路径是正确的。如果该文件是 Visual Studio 系统文件,那么您可能需要修复安装,或者移除并彻底重新安装 Visual Studio。 4. 编译器错误 CS0015 错误信息 类型“type”的名称太长。 解决方案 用户定义类型的完全限定名必须少于或等于 2048 个字符。 5. 编译器错误 CS0017 错误信息 程序“output file name”定义了不止一个入口点:function。
6
编译器执行此转换。此代码的问题在于上述转换被视为收缩转换,而编译器不允许进行隐式 收缩转换,原因是可能会丢失数据。 如果转换后的数据类型所占用的内存存储空间比转换前的数据类型所占用的少,则存在 收缩转换。例如,将 long 类型转换为 int 类型就被视为收缩转换。long 类型占用 8 个字 节的内存,而 int 类型只占用 4 个字节。若要查看数据丢失如何发生,请考虑以下示例: int i = 50; long lng = 3147483647; i = lng; 变量 lng 现在包含的值无法存储在变量 i 中,原因是该值太大。如果要将该值转换为 int 类型,就会丢失一些数据,并且转换后的值不同于转换前的值。 扩大转换与收缩转换相反。对于扩大转换,转换后的数据类型占用的内存存储空间比转 换前的数据类型占用的多。下面是一个扩大转换的示例: int i = 50; long lng = 100; lng = i; 请注意此代码示例和第一个示例之间的区别。这里,变量 lng 位于赋值运算符的左边, 所以它是赋值的目标。 在可以进行赋值前, 编译器必须将变量 (类型为 i int) 隐式转换为 long 类型,这是一个扩大转换,原因是从占用 4 个字节内存的类型 (int) 转换为占用 8 个字节 内存的类型 (long)。 由于不会发生数据丢失, 所以允许进行隐式扩大转换。 任何可以用 int 类 型存储的值也可以用 long 类型存储。 我们知道隐式收缩转换是不允许的,因此为了能够编译这些代码,就需要显式转换数据 类型。显式转换是使用强制转换来完成的。强制转换是 C# 中用来描述将一种数据类型转换 为另一种数据类型的术语。若要编译这些代码,我们需要使用以下语法: int i = 50; long lng = 100; i = (int) lng; // cast to int
第三行代码通知编译器在进行赋值前, 将变量 lng (类型为 long) 显式转换为 int 类型。 切记,使用收缩转换可能会丢失数据。使用收缩转换时应小心,而且即使可以编译代码,也 可能会在运行时获得意外的结果。 此讨 论只针对值类 型。使用 值类型就是直 接使用存 储在变量中的 数据。但 .NET Framework 还具有引用类型。使用引用类型就是使用对变量的引用,而不是使用实际数据。 引用类型的示例是类、 接口和数组。 不能隐式或显式地将一个引用类型转换为其他引用类型, 除非编译器允许特定的转换或可以实现相应的转换运算符。 下面的示例生成 CS0029:
2
// Cin 方法。 若要解决该错误, 可以删除代码中的所有 Main 方法, 只保留一个, 或者可以使用 /main 编译器选项指定要使用的 Main 方法。 下面的示例生成 CS0017: // CS0017.cs public class clx { static public void Main() { } } public class cly { public static void Main() { } } 6. 编译器错误 CS0019 错误信息 运算符“operator”无法应用在“type”和“type”类型的操作数。 解决方案 二进制运算符所操作的数据类型是该运算符不能处理的数据类型。例如,不能对字符串 使用 || 运算符。 下面的示例生成 CS0019: // CS0019.cs public class MyClass { [System.Diagnostics.ConditionalAttribute("DEBUG" || "TRACE")] CS0019 // try the following line instead // [System.Diagnostics.ConditionalAttribute("DEBUG")] public void TestMethod() {
以下“解决方案”中的内容对应的是“错误信息”中内容的解决方法。 1. 编译器错误 CS0003 错误信息 内存不足。 解决方案 编译器无法分配足够的虚拟内存完成编译。关闭所有不必要的应用程序并重新编译。 可能还需要增加页文件的大小,请确保有可用的磁盘空间。 当 .NET Framework SDK 与 C# 编译器的版本不匹配时,或者当一个或多个支持 C# 编译器的文件损坏时,也可能出现此错误;请重新安装 Visual Studio。 2. 编译器错误 CS0012 错误信息 类型“type”在未被引用的程序集中定义。必须添加对程序集“assembly”的引用。 解决方案 未找到引用类型的定义。如果所需的 .DLL 文件没有包括在编译中,则可能发生这种情 况。 下面的编译序列将导致 CS0012: // cs0012a.cs // compile with: /target:library public class A {} 然后: // cs0012b.cs // compile with: /target:library /reference:cs0012a.dll public class B { public static A f() {
3
// CS0017, delete one Main or use /main
//
} public static void Main() { } } 在本例中, 必须在 ConditionalAttribute 外指定条件逻辑。 只能向 ConditionalAttribute 传 递一个预定义符号。 7. 编译器错误 CS0020 错误信息 被常数零除。 解决方案 表达式在除法运算的分母中使用了字面(不是变量)值零。未定义被零除,因此无效。 8. 编译器错误 CS0021 错误信息 无法将带 [] 的索引应用于“type”类型的表达式。 解决方案 试图通过索引器访问不支持 索引器(C# 编程指南) 的数据类型的值。 当您试图在 C++ 程序集中使用索引器时,可能会遇到 CS0021。在这种情况下,请用 DefaultMember 属性修饰 C++ 类,以使 C# 编译器知道哪个索引器是默认的。下面的示例 生成 CS0021。 此文件编译成一个 .dll 文件(DefaultMember 属性被注释掉)以生成此错误。 // CPP0021.cpp // compile with: /clr /LD using namespace System::Reflection; // Uncomment the following line to resolve //[DefaultMember("myItem")] public ref class MyClassMC { public: property int myItem[int] {
4
int get(int i){ return 5; } void set(int i, int value) {} } }; 下面是调用此 .dll 文件的 C# 文件。此文件试图通过索引器访问该类,但由于没有成 员被声明为要使用的默认索引器,所以生成错误。 // CS0021.cs // compile with: /reference:CPP0021.dll public class MyClass { public static void Main() { MyClassMC myMC = new MyClassMC(); int j = myMC[1]; // CS0021 } } 9. 编译器错误 CS0022 错误信息 [] 内索引数错误,应为“number”。 解决方案 数组访问操作在方括号内指定的维数不正确。 10. 编译器错误 CS0026 错误信息 关键字“this”在静态属性、静态方法或静态字段初始值设定项中无效。 解决方案 this(C# 参考) 关键字引用的对象是类型的实例。由于静态方法不依赖于包含类的任 何实例,因此“this”关键字无意义,而这是不允许的。 下面的示例生成 CS0026: 复制代码 // CS0026.cs public class A
7
// CS0029.cs public class MyInt { private int x = 0; // Uncomment this conversion routine to resolve CS0029 /* public static implicit operator int(MyInt i) { return i.x; } */ public static void Main() { MyInt myInt = new MyInt(); int i = myInt; // CS0029 } } 13. 编译器错误 CS0031 错误信息 常数值“value”无法转换为“type”。 解决方案 试图对类型不能存储值的变量赋值。 14. 编译器错误 CS0034 错误信息 运算符“operator”对于“type1”和“type2”类型的操作数具有二义性。 解决方案 运算符用在了两个对象上,并且编译器找到多个转换。转换必须是唯一的,因此需要再 进行一项类型转换,或者使其中一个转换成为显式的。
5
{ public static int i = 0; public static void Main() { // CS0026 this.i = this.i + 1; // Try the following line instead: // i = i + 1; } } 11. 编译器错误 CS0027 错误信息 关键字“this”在当前上下文中不可用。 解决方案 在属性、方法或构造函数的外部发现了 this(C# 参考) 关键字。 若要修复此错误,请修改语句以消除 this 关键字的使用,并且/或者将语句的一部分或 全部移到属性、方法或构造函数的内部。 12. 编译器错误 CS0029 错误信息 无法将类型“type”隐式转换为“type”。 解决方案 编译器要求显式转换。例如,可能需要将右值转换成与左值相同的类型。或者必须提供 转换例程以支持某些运算符重载。 在将某个类型的变量赋给其他类型的变量时必须进行转换。当在不同类型的变量之间进 行赋值时,编译器必须将赋值运算符右边的类型转换为该赋值运算符左边的类型。假设有下 面的代码: int i = 50; long lng = 100; i = lng; i = lng; 进行赋值运算,但赋值运算符左右两边变量的数据类型不匹配。进行赋值前,编 译器将变量 lng(类型为 long)隐式转换为 int。此为隐式转换,原因是没有代码显式指示
1
return new A(); } } 然后: // cs0012c.cs // compile with: /reference:cs0012b.dll class C { public static void Main() { object o = B.f(); } } 可以通过使用 /reference:b.dll;a.dll 进行编译来解决此 CS0012 错误。 3. 编译器错误 CS0014 错误信息 无法找到所需的文件“file”。 解决方案 编译器需要某个文件,但它不在系统上。请确保路径是正确的。如果该文件是 Visual Studio 系统文件,那么您可能需要修复安装,或者移除并彻底重新安装 Visual Studio。 4. 编译器错误 CS0015 错误信息 类型“type”的名称太长。 解决方案 用户定义类型的完全限定名必须少于或等于 2048 个字符。 5. 编译器错误 CS0017 错误信息 程序“output file name”定义了不止一个入口点:function。
6
编译器执行此转换。此代码的问题在于上述转换被视为收缩转换,而编译器不允许进行隐式 收缩转换,原因是可能会丢失数据。 如果转换后的数据类型所占用的内存存储空间比转换前的数据类型所占用的少,则存在 收缩转换。例如,将 long 类型转换为 int 类型就被视为收缩转换。long 类型占用 8 个字 节的内存,而 int 类型只占用 4 个字节。若要查看数据丢失如何发生,请考虑以下示例: int i = 50; long lng = 3147483647; i = lng; 变量 lng 现在包含的值无法存储在变量 i 中,原因是该值太大。如果要将该值转换为 int 类型,就会丢失一些数据,并且转换后的值不同于转换前的值。 扩大转换与收缩转换相反。对于扩大转换,转换后的数据类型占用的内存存储空间比转 换前的数据类型占用的多。下面是一个扩大转换的示例: int i = 50; long lng = 100; lng = i; 请注意此代码示例和第一个示例之间的区别。这里,变量 lng 位于赋值运算符的左边, 所以它是赋值的目标。 在可以进行赋值前, 编译器必须将变量 (类型为 i int) 隐式转换为 long 类型,这是一个扩大转换,原因是从占用 4 个字节内存的类型 (int) 转换为占用 8 个字节 内存的类型 (long)。 由于不会发生数据丢失, 所以允许进行隐式扩大转换。 任何可以用 int 类 型存储的值也可以用 long 类型存储。 我们知道隐式收缩转换是不允许的,因此为了能够编译这些代码,就需要显式转换数据 类型。显式转换是使用强制转换来完成的。强制转换是 C# 中用来描述将一种数据类型转换 为另一种数据类型的术语。若要编译这些代码,我们需要使用以下语法: int i = 50; long lng = 100; i = (int) lng; // cast to int
第三行代码通知编译器在进行赋值前, 将变量 lng (类型为 long) 显式转换为 int 类型。 切记,使用收缩转换可能会丢失数据。使用收缩转换时应小心,而且即使可以编译代码,也 可能会在运行时获得意外的结果。 此讨 论只针对值类 型。使用 值类型就是直 接使用存 储在变量中的 数据。但 .NET Framework 还具有引用类型。使用引用类型就是使用对变量的引用,而不是使用实际数据。 引用类型的示例是类、 接口和数组。 不能隐式或显式地将一个引用类型转换为其他引用类型, 除非编译器允许特定的转换或可以实现相应的转换运算符。 下面的示例生成 CS0029:
2
// Cin 方法。 若要解决该错误, 可以删除代码中的所有 Main 方法, 只保留一个, 或者可以使用 /main 编译器选项指定要使用的 Main 方法。 下面的示例生成 CS0017: // CS0017.cs public class clx { static public void Main() { } } public class cly { public static void Main() { } } 6. 编译器错误 CS0019 错误信息 运算符“operator”无法应用在“type”和“type”类型的操作数。 解决方案 二进制运算符所操作的数据类型是该运算符不能处理的数据类型。例如,不能对字符串 使用 || 运算符。 下面的示例生成 CS0019: // CS0019.cs public class MyClass { [System.Diagnostics.ConditionalAttribute("DEBUG" || "TRACE")] CS0019 // try the following line instead // [System.Diagnostics.ConditionalAttribute("DEBUG")] public void TestMethod() {