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#添加类似内容的原因.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。