程序出自我的一个小项目:
Point endFt;
if(isshow)
{
   endFt = new Point(200,200);
}
if (x != 0 && y != 0 && endFt != null)
{
    Point pCenterPoint = new Point(x, y);
    Point pEndPoint = endFt;
}
在这段程序中编译时会出错说 Error:Use of unassigned local variable 'endFt'(Point pEndPoint = endFt;本行中)
我们在 if (x != 0 && y != 0 && endFt != null)中指明了endFt为空时不往下执行,当然此问题有很多办法解觉,但我觉得编译器应该能做些判断.算是给microsoft的一点见意,可能是我考虑欠全面,大家也表明一下看法

解决方案 »

  1.   

    省点力气吧 先把语法弄明白了Point endFt= new Point();
      

  2.   

    Point endFt= new Point();
    Point endFt;
    语法都是正确的,现在只是想让他初始为空!
      

  3.   

    Point是值类型,
    Point endFt;就已经给endFt赋值了,不需要再new Point(),没有指定,系统会默认endFt.X = 0;endFt.Y = 0;所以当然不会出现endFt == null;
    你先了解一下什么叫引用类型和值类型,了解一下这些基础知识。
      

  4.   

    对了,忘了,我用的是.netframework3.0 wpf ..可能在2.0中如YapEro([::q^-^p::]) 所说吧,我还真不太了解!大家继续观注一下吧~
      

  5.   

    确实是这样,不过不是什么大问题
      
    *****************************************************************************
    欢迎使用CSDN论坛阅读器 : CSDN Reader(附全部源代码) 
    http://www.cnblogs.com/feiyun0112/archive/2006/09/20/509783.html
      

  6.   

    申明与定义更本不是同一个意思。
    Point endFt;  在申明的时候,只是给他一个类型,让编译器了解其数据结构,以便在运行期的时给其赋予恰当的值。Point endFt= new Point();  在定义的时候,会调用默认的构造函数,初始化其值,并且分配实际的内存空间。比如你写 DataSet ds; 但以后不用他,编译器会说 “声明了变量“ds”,但从未使用过”,
    但如果你写 DataSet ds=new DataSet();  就没有任何问题。
    省点力气吧 先把语法弄明白了
      

  7.   

    比如你写 DataSet ds; 但以后不用他,编译器会说 “声明了变量“ds”,但从未使用过 
    我所说的出错不是这个错,而是 Error:Use of unassigned local variable 'endFt'(Point pEndPoint = endFt;
      

  8.   

    MS没有错,这样做是必要的,因为这样会让增加你的代码的正确性,如果你允许你的这种代码通过编译,你可以在项目属性中进行设置,让编译器忽略这种错误提示。(但不建议你这么做,你还是写成Point endFt = null; 吧,这是一个好的编程习惯)。
      

  9.   

    其实.net framework IL代码是允许这样的,只不过编译器为了代码的规范性所做的限制。
    确实是编译器的原因。Point endFt;
    因为Point是值类型,所以IL指令自动为其在工作进程栈中分配了地址,并将endFt的值赋为0(二进制意义上的0,具体我也不是很明白,底层知识不够)。所以流程会进入(endFt!=null)的判断。但因为如果RefPoint是引用类型,那么
    RefPoint refPoint;这种只声明而不实例化的情况下,refPoint == null;因为refPoint在工作进程栈中作为指针没有指向托管区内任何对象。所有的struct和enmurator类型都是值类型,所有的class都是引用类型。在你声明的时候,编译器能够区分你声明的变量是何类型,IL指令也会相应分配进程内存和托管区空间,但编译器需要你实例化(就是手动指定内存空间)才能编译通过,确实只是编译器的规范化限制。