使用未分配的局部变量? C#
作者:互联网
我有以下代码:
double ticketPrice;
LoadOperation loGetTickets = ticketClass.loadTickets();
loGetTickets.Completed += (s, args) =>
{
foreach (Web.Ticket tt in ticketClass.getContext())
{
if (tt.bookingId == data.bookingId)
{
pView.lblTicketAmount.Content = "£" + tt.ticketPrice;
MessageBox.Show("Price: " + tt.ticketPrice);
ticketPrice = Convert.ToDouble(tt.ticketPrice);
pView.lblTicketName.Content = tt.ticketName;
break;
}
}
}; double subTotal = ticketPrice + ticketQuantity;
当我运行它时,出现错误:使用未分配的局部变量“ ticketPrice”
如您所见,确实从循环中为其分配了一个值.
如果我使用:
double ticketPrice = 0.0;
错误消失了,但是值保持在0.0,但是我不明白,因为消息框每次都出现并输出值,所以我假设tt.ticketPrice的值正在填充ticketPrice
谁能帮助我解决这个问题.
谢谢
解决方法:
您说的是ticketPrice的值保持为零,但是代码未显示读取变量值的位置!
如果该行为在您发布的摘录之后的某些代码中使用过,则将是有意义的.例如.:
double ticketPrice;
LoadOperation loGetTickets = ticketClass.loadTickets();
loGetTickets.Completed += (s, args) => {
// Set value of 'ticketPrice'
ticketPrice = ...
};
// Use the value of the variable
Console.WriteLine(ticketPrice); // (*)
这是行不通的,因为标记为(*)的行实际上是在Completed处理程序中设置变量值之前完成的.为了使其正常工作,您需要将使用变量的代码移到处理程序中(在设置变量值的代码之后).
然后,在方法中声明变量当然是没有意义的,因为它将仅在lambda函数的主体中使用,因此您将得到如下结果:
LoadOperation loGetTickets = ticketClass.loadTickets();
loGetTickets.Completed += (s, args) => {
double ticketPrice;
// Set value of 'ticketPrice'
ticketPrice = ...
// Use the value of the variable
Console.WriteLine(ticketPrice); // (*)
};
我相信您刚刚发现了C#4 :-)中异步编程的痛点.这就是为什么F#支持异步工作流(您可以在其中编写相同的代码而没有事件处理程序)的原因,也是C#设计人员考虑在将来考虑向C#添加类似内容的原因.
标签:local-variables,c,silverlight 来源: https://codeday.me/bug/20191102/1993197.html