如果定义这样的一个结构:struts S{
  public int P{get;set;}
}我们知道未赋值的局部变量是不能使用的,所以下面这句不能通过编译:S s;
s.ToString();正确做法应该是:S s=new S();
s.ToString();但是却惊奇的发现这样的使用下面语句居然也能通过编译:S s;
s.P=0;
s.ToString();给s的属性赋值就能编译通过了。难道C#的编译看到"="号就放过吗?

解决方案 »

  1.   

    错误 1 使用了未赋值的局部变量“s” E:\Study\Code\CSDN_Testing\CSDN_Testing\Program.cs 438 13 CSDN_Testing//为什么我的不能通过编译?
      

  2.   

    Error 1 Use of unassigned local variable 's' E:\Study\ConsoleDemo\Demo.cs 17 13 ConsoleDemo
      

  3.   

    抱歉,写错了。
    不是属性是字段:struts S{
      public int P;
    }最近vs2008用的多了些,习惯性的写成属性了...
      

  4.   

    struct
    这个也写错了
    杯具啊
      

  5.   

    我的编译不通过额,LZ,不知道你的怎么搞的额,我的只要s没被声明就显示错误……
      

  6.   

    struct是值类型的,
    有米有赋值应该都算有实例的吧(反正就是有值的,不知怎么表达)
    就是语法问题了吧。
      

  7.   

    晕,我的终于和楼主你出现的情况一样了……
    我感觉在为写s.P=0;之前,并没给s赋值,所以会报错,写完后,通过s.P给P赋值了,s里也就有具体的值了,所以不会报错吧……
    个人猜测……菜鸟、小易 上。
      

  8.   

    如果直接
    Console.WriteLine(s.p);//也是会报错,所可能使用未赋值的变量
      

  9.   

    如果不使用 new,则在初始化所有字段之前,字段都保持未赋值状态且对象不可用。
      

  10.   

    S s;
    s.p = 1;
    s.ToString();
    ------------------
    对应的CIL是:.method private hidebysig static void  Main(string[] args) cil managed
    {
      .entrypoint
      // 代码大小       24 (0x18)
      .maxstack  2
      .locals init (valuetype CSDN_Testing.S V_0)
      IL_0000:  nop
      IL_0001:  ldloca.s   V_0
      IL_0003:  ldc.i4.1
      IL_0004:  stfld      int32 CSDN_Testing.S::p
      IL_0009:  ldloca.s   V_0
      IL_000b:  constrained. CSDN_Testing.S
      IL_0011:  callvirt   instance string [mscorlib]System.Object::ToString()
      IL_0016:  pop
      IL_0017:  ret
    } // end of method Program::Main会看到s.ToString()是调用object实例方法ToString()
      

  11.   

    你试试struct S
    {
        public int P;
        public int Q;
    }熟悉就好了。不过我肯定不会去熟悉它——我从来不使用struct。
      

  12.   

    要说是bug。我想也算。
    struct不用new。使用new初始化的方式只是兼容类的写法。
    你写不写new实际上都已经创建好一个结构体了。
    但是没有初始化就使用,在编译时候就会提示错误。
      

  13.   

    也就是说,如果使用new来创建结构,并且会自动地给各字段进行初始化,如果不用new,那么必须给所有的字段赋值后,才能使用
    刚才又试验了一下,如果结构含有属性,则必须要new一下才能使用
      

  14.   


    “如果不使用 new,则在初始化所有字段之前,字段都保持未赋值状态且对象不可用。”
    关键...
      

  15.   

    http://www.csharpwin.com/csharpspace/6771r1359.shtml:C#结构了解之前的话:在C++语言里面结构struct和类在许多方面都是相近的,只不过在存取方式上存在差别。但是,在C#下结构和类有着明显的不同点:    1、C#结构是堆栈对象,不能在堆上创建它;    2、C#结构可以继承接口,但是不能继承自其它结构;    3、不能重写结构的默认构造函数,需要自定义构造函数时必须创建附带参数的构造函数,以保证和默认构造函数的参数列表有所区别;    4、当使用new来创建结构对象时其构造函数自动被调用,若仅是像声明一个int类型的变量那样声明一个结构类型的变量而不new的话,那么结构中成员变量必须被初始化后才能使用该结构对象。    C#结构实例:struct Student : IGrade   public int maths;  public int english;  public int csharp;   public int GetTot()      {  return maths+english+csharp;      }       public Student(int y)  {  maths = english = csharp = y;   }  }      public string GetGrade()   {  if(GetTot() > 240 )   return "Brilliant";  if(GetTot() > 140 )  return "Passed";  return "Failed";   }  }  interface IGrade  {      string GetGrade();  }     接下来看看怎么使用刚才创建的C#结构,代码如下:Student s1 = new Student();  Console.WriteLine(s1.GetTot());  Console.WriteLine(s1.GetGrade());     C#结构示例之输出:0  Failed     上述代码显示默认的构造函数被调用,构造函数将所有结构中的int成员变量都自动初始化为0,这就是为何合计为0的原因。    下面来看一段有意思的代码:Student s2;  s2.maths = s2.english = s2.csharp = 50;  Console.WriteLine(s2.GetTot());  Console.WriteLine(s2.GetGrade()); C#结构示例之输出:150  Passed     上述代码我们没有使用new来创建结构,所以构造函数不会被调用,仅是声明一个结构类型的变量s2,但是紧接着我们为结构的所有成员变量进行初始化赋值,那么结构照样可以使用。尽管很多人都在争论,认为这种赋值伎俩太不专业且显得有点傻,然而谁也无法找到合情合理的解释,但是这样做的确可行。当我们注释掉赋值语句后,编译器则会报错:使用了未赋值的本地变量s2。    我们还可以使用自定义构造函数并传递一个整型变量来创建结构对象,代码如下:Student s3 = new Student(90);  Console.WriteLine(s3.GetTot());  Console.WriteLine(s3.GetGrade());     C#结构示例之输出:270  Brilliant     不像类是引用类型,结构是值类型的,所以结构比类操作起来更简单。当使用类仅存储一些数据时,你会发现使用结构会好得多!结构化数组是在堆上创建的,而以一个一个类的形式来创建对象,则必须提前在堆上分配内存,而且每个类的引用地址也需要额外保存起来,所以使用结构化数组则更加的有效率。实际上在.Net框架里大部分类也都是结构,譬如:System.Drawing.Point。    关于C#结构的相关内容就向你介绍到这里,希望对你学习C#结构有所帮助。
      

  16.   


    msdn不是解释了嘛,编译器本来就是这样刻意设计的,以方便两种不同习惯的人确保编程正确(而不是少写几个字母)。
      

  17.   

    就如同下面这个例子:string s = ""; 与string s = new string();一个是使用构造函数, 另一种方式是直接赋值...
      

  18.   

    哦哦,原来对每个字段初始话就可以啦这个可以设置还真是蛮奇怪的,
    如果结构某些字段是私有的private,
    这样的用法就行不通了个人感觉通用性不强。不过我很少用结构,这个特性反正没影响我呵呵
      

  19.   

    真搞不懂,未付值就给它个 数字0、字串""、布尔false、日期1900-01-01 呗,何必弄出个null整得那么麻烦。
    特别是除以零的情况,就让其值为零就是了嘛如:123/0=0 很多情况都需要这么用的。打屁多事,弄得sql语句里边一大堆的case when、excel公式里边一大堆的iserror。