编程语言
首页 > 编程语言> > 使用未分配的局部变量? C#

使用未分配的局部变量? 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