ClassMC myMC = new MyClassMC(); int j = myMC[1]; // CS0021 } } 9. 编译器错误 CS0023 错误信息 运算符“operator”无法应用于“type”类型的操作数。 解决方案 return 5; } void set(int i, int value) {}
试图将运算符应用于类型没有被
设计用于该运算符的变量。有关更多信息,请参见数据 类型(C# 编程指南)和 C# 运算符。
4
扫雷英雄榜——ASP.
NET常见错误及解决方案 王牌8
// CS0023.cs namespace x { public class a { public static void Main() { string s = "hello"; s = -s; } } } 10. 编译器错误 CS0026 错误信息 关键字“this”在静态属性、静态方法或静态字段初始值设定项中无效。 解决
方案 // CS0023, minus operator not allowed on strings
this(C# 参考) 关键字引用的对象是类型的实例。由于静态方法不依赖于包含类的任 何实例,因此“this”关键字无意义,而这是不允许的。 下面的示例生成 CS0026: 复制代码 // CS0026.cs public class A { 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 5
ASP.NETT从入门到精通
错误信息 关键字“this”在当前上下文中不可用。
解决方案
在属性、方法或构造函数的外部发现了 this(C# 参考) 关键字。 若要修复此错误,请修改语句以消除 this 关键字的使用,并且/或者将语句的一部分或 全部移到属性、方法或构造函数的内部。 12. 编译器错误 CS0029 错误信息 无法将类型“type”隐式转换为“type”。 解决方案
编译器要求显式转换。例如,可能需要将右值转换成与左值相同的类型。或者必须提供 转换例程以支持某些运算符重载。 在将某个类型的变量赋给其他类型的变量时必须进行转换。当在不同类型的变量之间进 行赋值时,编译器必须将赋值运算符右边的类型转换为该赋值运算符左边的类型。假设有下 面的代码: int i = 50; long lng = 100; i = lng; i = lng; 进行赋值运算,但赋值运算符左右两边变量的数据类型不匹配。进行赋值前,编 译器将变量 lng(类型为 long)隐式转换为 int。此为隐式转换,原因是没有代码显式指示 编译器执行此转换。此代码的
问题在于上述转换被视为收缩转换,而编译器不允许进行隐式 收缩转换,原因是可能会丢失数据。 如果转换后的数据类型所占用的内存存储空间比转换前的数据类型所占用的少,则存在 收缩转换。例如,将 long 类型转换为 int 类型就被视为收缩转换。long 类型占用 8 个字 节的内存,而 int 类型只占用 4 个字节。若要查看数据丢失如何发生,请考虑以下示例: int i = 50; long lng = 3147483647; i = lng; 变量 lng 现在包含的值无法存储在变量 i 中,原因是该值太大。如果要将该值转换为
int 类型,就会丢失一些数据,并且转换后的值不同于转换前的值。
扩大转换与收缩转换相反。对于扩大转换,转换后的数据类型占用的内存存储空间比转 换前的数据类型占用的多。下面是一个扩大转换的示例:
6
扫雷英雄榜——ASP.NET常见错误及解决方案 王牌8
int i = 50; long lng = 100; lng = i; 请注意此代码示例和第一个示例之间的区别。这里,变量 lng 位于赋值运算符的左边, 所以它是赋值的目标。 在可以进行赋值前, 编译器必须将变量 (类型为 i int) 隐式转换为 long 类型,这是一个扩大转换,原因是从占用 4 个字节内存的类型 (int) 转换为占用 8 个字节 内存的类型 (long)。 由于不会发生数据丢失, 所以允许进行隐式扩大转换。 任何可以用 int 类 型存储的值也可以用 long 类型存储。 我们知道隐式收缩转换是不允许的,因此为了能够编译这些代码,就需要显式转换数据 类型。显式转换是使用强制转换来完成的。强制转换是 C# 中用来描述将一种数据类型转换 为另一种数据类型的术语。若要编译这些代码,我们需要使用以下语法: int i = 50; lon