CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  .NET技术 >  C#

奇怪了,这怎么解释?在循环里面给值类型赋值没用?

楼主qileroro()2006-05-04 12:08:10 在 .NET技术 / C# 提问

下面的代码为什么会有“使用了未赋值的局部变量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

相关问题

关键词

得分解答快速导航

  • 帖主:qileroro
  • zhongkeruanjian
  • yurow
  • Knight94
  • charles_y

相关链接

  • CSDN .NET频道
  • .NET类图书
  • C#类图书
  • .NET类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo