C# 当我尝试在if()中使用一个变量时,它表示我正在使用一个未分配的变量

C# 当我尝试在if()中使用一个变量时,它表示我正在使用一个未分配的变量,c#,multithreading,C#,Multithreading,(我这样做是因为我在使用线程) (然后当我尝试在if中使用它时) (我得到一个错误,说我正在使用未赋值变量) 有人能告诉我为什么会这样吗?来自 C#编译器不允许使用未初始化的变量。如果 编译器检测到可能未使用的变量的使用 初始化后,将生成编译器错误 您声明了x1变量,但未对其进行初始化。可能需要像这样初始化它 if(x1 == "X"){} 或 从 C#编译器不允许使用未初始化的变量。如果 编译器检测到可能未使用的变量的使用 初始化后,将生成编译器错误 您声明了x1变量,但未对其进行初始化。可

(我这样做是因为我在使用线程) (然后当我尝试在if中使用它时)

(我得到一个错误,说我正在使用未赋值变量)

有人能告诉我为什么会这样吗?

来自

C#编译器不允许使用未初始化的变量。如果 编译器检测到可能未使用的变量的使用 初始化后,将生成编译器错误

您声明了
x1
变量,但未对其进行初始化。可能需要像这样初始化它

if(x1 == "X"){}

C#编译器不允许使用未初始化的变量。如果 编译器检测到可能未使用的变量的使用 初始化后,将生成编译器错误

您声明了
x1
变量,但未对其进行初始化。可能需要像这样初始化它

if(x1 == "X"){}


编译器没有意识到您正在分配x1,因为这不是一个直接的分配。 因此,只需更改这一行:

string x1 = null;

编译器没有意识到您正在分配x1,因为这不是一个直接的分配。 因此,只需更改这一行:

string x1 = null;

由于在不同的线程中分配了
x1
,因此主线程中的
x1
未分配

您可以通过在声明
x1
时将
null
赋值给
x1
来更正它

string x1 = null; // or assign a different default value

由于在不同的线程中分配了
x1
,因此主线程中的
x1
未分配

您可以通过在声明
x1
时将
null
赋值给
x1
来更正它

string x1 = null; // or assign a different default value
见:

字符串x1;//x1=lbl1.Content.ToString());
//可能发生的情况是,不同的线程尚未完成,并且
//x1仍然未分配;这就是编译器显示警告的原因
如果(x1==“X”){}
然而,在某些情况下,编译器不能仅仅跟踪赋值,例如

字符串x1;
行动f=
()=>{x1=“X”;};
f();// 见:

字符串x1;//x1=lbl1.Content.ToString());
//可能发生的情况是,不同的线程尚未完成,并且
//x1仍然未分配;这就是编译器显示警告的原因
如果(x1==“X”){}
然而,在某些情况下,编译器不能仅仅跟踪赋值,例如

字符串x1;
行动f=
()=>{x1=“X”;};

f();// 想想看,您正在使用多线程

  • 在线程A上声明
    x1
  • 在线程A上,您试图使用
    x1
  • 在线程B上分配
    x1
  • 现在,事件的顺序是什么?会是
    1>3>2
    ?编译器为什么要假设这一点?

    如果它将是
    1>2>3
    ,则表示您试图在分配它之前使用
    x1
    ,而这正是编译器所抱怨的。

    想想看,您使用的是多线程

  • 在线程A上声明
    x1
  • 在线程A上,您试图使用
    x1
  • 在线程B上分配
    x1
  • 现在,事件的顺序是什么?会是
    1>3>2
    ?编译器为什么要假设这一点?

    如果它将是
    1>2>3
    ,则表示您试图在分配它之前使用
    x1
    ,而这正是编译器所抱怨的。

    当您这样分配x1时

      String x1;
    
      Action f = 
        () => { x1 = "X"; };
    
      f(); // <- x1 will be assigned here
    
      // Compiler erroneously warns here that x1 is unassigned,
      // but x1 is assigned  
      if (x1 == "X") 
    
    您正在另一个线程上分配x1,但编译器无法检测到您的变量已分配

    尝试为x1设置默认值,这将解决问题

    string x1;                  
    Dispatcher.Invoke(new Action (() => x1 = lbl1.Content.ToString()));
    

    希望这样分配x1时有帮助

      String x1;
    
      Action f = 
        () => { x1 = "X"; };
    
      f(); // <- x1 will be assigned here
    
      // Compiler erroneously warns here that x1 is unassigned,
      // but x1 is assigned  
      if (x1 == "X") 
    
    您正在另一个线程上分配x1,但编译器无法检测到您的变量已分配

    尝试为x1设置默认值,这将解决问题

    string x1;                  
    Dispatcher.Invoke(new Action (() => x1 = lbl1.Content.ToString()));
    

    希望它有帮助

    因为您在不同的线程中分配了x1,所以在主线程中x1可能是未分配的。这就是为什么编译器警告您也看到了。因为您在不同的线程中分配了x1,所以可能在主线程中x1是未分配的。这就是为什么编译器会发出警告,因为Dispatcher.Invoke是一个阻塞(同步)调用。这是可能的还是编译器不知道?@James Barras:是的,如果赋值很复杂,编译器可能会发出错误的警告;如果Dispatcher.Invoke是一个阻塞(同步)调用,请参阅我的edit。这是可能的还是编译器不知道?@James Barras:是的,如果赋值很复杂,编译器可能会发出错误的警告;查看我的编辑