微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用未分配的局部变量? 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#添加类似内容的原因.

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

相关推荐