错误原因是 系统检测到当 switch(XX.Text)的值 没有列举出时 
跳转到default 后没有赋值,修正:将 default:break; 改为
default:
str="select * from A where";  
break;你试试

解决方案 »

  1.   

    变量使用前必须初始化。
    string str="";
      

  2.   

    class ex{
    public test()
    {
     string str="";
      ....
     str+="your date"
    }
    }
      

  3.   

    在class里定义变量就不用赋初值,你的是局部的就要赋了,可以赋成“”
      

  4.   

    我不是在提问。我也知道没有赋初值。我也知道变量没有初始化。还有个"大吓"误认为我把switch语句弄错了。不是的。你们再看一下主题。不过还是谢谢你们。语法探讨。
    我写一个类.
     首先定义一个类型。string str;因为这个str在这个类里都要用到。然后我用一个选择语句。来给str赋值.
                {
                    string str;
                  switch(XX.Text)
                   {  case "A":
                      str="select * from A where";  
                    break;
                      case "B":
                      str="select * from A where";  
                       break;
                      case "C":
                      str="select * from A where";  
                          :
                          :
                      default:
                       break;
                     }
              //str已赋值.
              SqlDataAdapter adapter=new SqlDataAdapter(str,conn);
                 //此处用到str 的赋值.
                           :
                           : 
                             }
                 //完毕运行。错误提示:  使用未赋值的局部变量"str";
           
              偶不用管它。继续运行。程序成功。           为了不让它有错误提示。我给str在刚开始定义时随便赋个值 。
                     string str="a";//换掉前面的string str;
                   运行。正确;
                使我程序的str无缘无姑的多了个赋值。我才不要了。C语言中这样定义,它也没错呀。为什么在C#(ASP)这样定义就不行了呢? 是.net 的漏洞还是我错了。请教各位。有没有遇到跟小吓一样问题。只因想多了解了解。特提此问 .
      

  5.   

    在前面的 switch语句中存在一种情况 (default 情况下)没有给str赋值。而编译器编译的时候 系统并不知道 str是否会赋值,注意这里不是运行时,
    所以会提出警告错误,如果要避免这种情况 又不想在刚开始定义时随便赋个值,
    就要保值在switch语句中所有的可能都要给str赋值(补充 default赋值)你觉得呢?
      

  6.   

    TO:  古鲁
    却是,如你所说。要给dafault赋值。但是有时我这样定义也会出现类似的问题:       {   string str;
            if(...)
              {   str=...;
                    }
             if(....)
               {
                  str=...;
                   }
              if(....)
               {
                 str=....;
                  }
             SqlCommand comm=new SqlCommand(str,conn);
                :
                :         }它也会出现类似的问题? 请教各位。有为何解了。
      

  7.   

    这点好象要从c语言说起吧,在c里如果你只定义一个指针变量没有给这个变量指向一个地址的话,这个指针变量的值将是随机的,也就是说,这个指针会指向任意地址,这样很明显是不安全的。
    在.net中,有一个很重要的特性就是内存安全(相对于unsafe)。另外,在C#中一个引用变量的功能就相当于一个指针,它指向托管空间中某个对象的首地址。但是,在一个引用变量指向一个对象时,.Net会做相关的检查以保证这样的引用不会产生溢出,比如引用变量的类型与对象的类型是不是匹配。很明显这样的检查工作大部分是可以在程序编译时就可以完成的。而当一个变量没有赋任何值的情况下(连null都不是),程序就使用了这个变量,这样的操作是于前面说的内容安全是相悖的。
      

  8.   

    官方解释:
    ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/csspec/html/vclrfcsharpspec_A.htm
    # 语言规范   A. 不安全代码如前面几章所定义,核心 C# 语言没有将指针列入它所支持的数据类型,从而与 C 和 C++ 有着显著的区别。作为替代,C# 提供了各种引用类型,并能够创建可由垃圾回收器管理的对象。这种设计结合其他功能,使 C# 成为比 C 或 C++ 安全得多的语言。在核心 C# 语言中,干脆不可能有未初始化的变量、“虚”指针或者超过数组的边界对其进行索引的表达式。这样,以往总是不断地烦扰 C 和 C++ 程序的一系列错误就不会再出现了。尽管实际上对 C 或 C++ 中的每种指针类型构造,C# 都设置了与之对应的引用类型,但仍然会有一些场合需要访问指针类型。例如,当需要与基础操作系统进行交互、访问内存映射设备,或实现一些以时间为关键的算法时,若没有访问指针的手段,就不可能或者至少很难完成。为了满足这样的需求,C# 提供了编写不安全代码的能力。在不安全代码中,可以声明和操作指针,可以在指针和整型之间执行转换,还可以获取变量的地址,等等。在某种意义上,编写不安全代码很像在 C# 程序中编写 C 代码。无论从开发人员还是从用户角度来看,不安全代码事实上都是一种“安全”功能。不安全代码必须用修饰符 unsafe 明确地标记,这样开发人员就不会误用不安全功能,而执行引擎将确保不会在不受信任的环境中执行不安全代码。