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