奇怪了,这怎么解释?在循环里面给值类型赋值没用?
下面的代码为什么会有“使用了未赋值的局部变量p”的错误?
明明在循环里面赋值了啊?如果把Point p;换成Point p = new Point();就不会有错。
还有用在前面加上那个注释掉的循环就不会有错误了,这种情况请解释一下。
谢谢。。。。。
using System;
struct Point {
public Int32 x,y;
public override string ToString() {
return "x=" + x.ToString() + ",y=" + y.ToString();
}
};
class Test {
public static void Main() {
Point p;
// Point p = new Point();
// for (; true; ) { p.x = p.y = 123; break; }
for (int i=0; i<3; i++) { p.x = p.y = 234; }
Console.WriteLine(p); // <------ 编译错误:使用了未赋值的局部变量“p”
}
};
问题点数:30、回复次数:9Top
1 楼zhongkeruanjian(编程亮子)回复于 2006-05-04 12:34:50 得分 3
Point p
这个语句说明你只是声明了一个Point的引用,而没有实例。
一个没有实例的引用是不能访问其属性和方法的。
Point p = new Point();
这个语句是说先声明一个引用,在声明一个实例。然后把这个实例赋予这个引用。
你就是p当指针Top
2 楼yurow(路漫漫其修远兮,吾将上下而爬楼梯!)回复于 2006-05-04 12:35:48 得分 15
Point p; //申明,未给值,在C#中是不能使用的
Point p = new Point(); //等于他新的实例,可以使用了
p.x = p.y = 123; //给值,所以可以使用
for (; true; ) { p.x = p.y = 123; break; } //总是可以执行,这是编译器也能判断的
for (int i=0; i<3; i++) { p.x = p.y = 234; } //编译器不能判断它是否总是执行,编译器并不知道i=0,i<3.定成0,0就是不执行了
就和
string x;
bool y = true;
if(y)
x = "asd"
return x; //x未给值?至少编译器 这么认为Top
3 楼yurow(路漫漫其修远兮,吾将上下而爬楼梯!)回复于 2006-05-04 12:37:07 得分 0
to zhongkeruanjian(编程亮子)
struct Point
这是个结构不是类Top
4 楼Knight94(愚翁)回复于 2006-05-04 12:39:38 得分 0
你的这句
Console.WriteLine(p);
不等于
Console.WriteLine(p.ToString());
Top
5 楼charles_y(每天上网一小时)回复于 2006-05-04 12:40:37 得分 0
是个编译错误?
编译器不能判断这句 for(int i...)一定能够执行,只有运行了才能知道这句话会执行,但编译器无法先行作出判断,所以认为你错了Top
6 楼Knight94(愚翁)回复于 2006-05-04 12:41:25 得分 0
c#是强类型检查,也就是说系统不会把一个struct类型的变量转换成string进行输出。Top
7 楼charles_y(每天上网一小时)回复于 2006-05-04 12:41:44 得分 0
而for(;;)应该可以,你试试Top
8 楼Knight94(愚翁)回复于 2006-05-04 12:43:31 得分 3
看错了,
即使是值类型变量,也需要先初始化后才能使用,这是语言要求。Top
9 楼charles_y(每天上网一小时)回复于 2006-05-04 12:44:35 得分 9
int mydigit()
{
int i=2;
if(i>0)
return 1;
}
就如同上面的例子一样,虽然我们知道这个函数肯定会返回1,但编译器不知道,他会告诉你不是所有的路径都有返回值Top




