Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
解析浮点时的C#空引用_C#_Asp.net - Fatal编程技术网

解析浮点时的C#空引用

解析浮点时的C#空引用,c#,asp.net,C#,Asp.net,我有下面的代码。这非常有效,我希望允许MaxDemand为空值。但由于我正在解析一个字符串,如果我不输入一些值,它似乎会出错 异常详细信息:System.NullReferenceException:对象引用未设置为对象的实例 实现错误处理解决方案的最佳解决方案是什么?我试过float.TryParse,但没法用 谢谢你查看我的问题 protected void GridView3_RowUpdating(object sender, GridViewUpdateEventArgs e)

我有下面的代码。这非常有效,我希望允许MaxDemand为空值。但由于我正在解析一个字符串,如果我不输入一些值,它似乎会出错

异常详细信息:System.NullReferenceException:对象引用未设置为对象的实例

实现错误处理解决方案的最佳解决方案是什么?我试过float.TryParse,但没法用

谢谢你查看我的问题

    protected void GridView3_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {
    float Cost = 0.0F; 
    float Consumption = 0.0F;
    int InvoiceID = 0;
    float MaxDemand = 0.0F;
    DateTime ServiceFrom = new DateTime();
    DateTime ServiceTo = new DateTime();

    foreach (string key in e.NewValues.Keys)
        switch (key)
        {
            case "TotalInvoice": Cost = float.Parse(e.NewValues[key].ToString()); 
                                break;
            case "EnergyInvoiceID": InvoiceID = int.Parse(e.NewValues[key].ToString()); 
                                break;
            case "Consumption": Consumption = float.Parse(e.NewValues[key].ToString()); 
                                break;
            case "ServiceFrom": ServiceFrom = DateTime.Parse(e.NewValues[key].ToString());
                                break;
            case "ServiceTo":   ServiceTo = DateTime.Parse(e.NewValues[key].ToString());
                                break;
            case "MaxDemand": MaxDemand = float.Parse(e.NewValues[key].ToString());
                                break;
        }

    UpdateInvoice(InvoiceID, Cost, Consumption, ServiceFrom, ServiceTo, MaxDemand);
    GridView3.EditIndex = -1;
    PopulateAccountHistory();
}

使用一个可为null的类型并检查e.NewValues[Key]是否为null如何

float? MaxDemand;
然后

case "MaxDemand": 
{
   if(e.NewValues[key] != null)
   {
     MaxDemand = float.Parse(e.NewValues[key].ToString());
   }
   break;
}

这里的问题不是实际解析
浮点值
双精度
值。如果失败,它将返回一个更具体的异常。问题似乎是
e的返回之一。NewValues[key]
返回
null
,您正在调用
ToString

最好在循环开始时集中
null
检查。它还允许您删除对
e.NewValues[key]
的重复调用

 foreach (string key in e.NewValues.Keys) {
   var value = e.NewValues[key];
   if (value == null) { 
       continue;
   }

   var str = value.ToString();
   switch (key) {
     case "TotalInvoice": 
       Cost = float.Parse(str);
       break;

     ...

从my
NullableExtensions

public static T? Parse<T>(object obj)
    where T : struct
{
    if (obj == null) return null;
    try
    {
        return (T)System.Convert.ChangeType(obj, typeof(T));
    }
    catch (FormatException) { return null; }
    catch (InvalidCastException) { return null; }
}

case "TotalInvoice": Cost = NullableExtensions.Parse<float>(e.NewValues[key]); break;
publicstatict?解析(对象obj)
其中T:struct
{
if(obj==null)返回null;
尝试
{
return(T)System.Convert.ChangeType(obj,typeof(T));
}
catch(FormatException){returnnull;}
catch(InvalidCastException){returnnull;}
}
案例“TotalInvoice”:Cost=NullableExtensions.Parse(例如NewValues[key]);打破

您的问题可能是其中一个e.NewValues[key]返回null,当调用null值时,.ToString()调用失败,但我猜;如果您可以发布异常的stacktrace,它可能会被清除。感谢JaredPar解释了我的问题,并向我展示了如何修复它。这真的帮助并解决了我的问题!我欠你一杯啤酒!在该方法签名中不需要一个
其中t:struct