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