【发布时间】:2013-11-25 19:24:25
【问题描述】:
使用以下代码:
foreach (JObject obj in arr)
{
id = (string)obj["Id"];
packSize = (Int16)obj["PackSize"];
var description = (string)obj["Description"];
var deptSubdept = (Double)obj["DeptDotSubdept"];
var unitCost = (Double)obj["Unit_Cost"];
var unitList = (Double)obj["Unit_List"];
var UPC_Code = (string)obj["UPC_code"];
var UPC_packSize = (Int16)obj["UPC_pack_size"];
var CRVId = (Int32)obj["CRV_Id"];
inventoryItems.Add(new WebAPIClientUtils.InventoryItem
{
Id = id,
PackSize = packSize,
Description = description,
DeptDotSubdept = deptSubdept,
Unit_Cost = unitCost,
Unit_List = unitList,
UPC_code = UPC_Code,
UPC_pack_size = UPC_packSize,
CRV_Id = CRVId
});
...我得到,“System.ArgumentException:输入字符串的格式不正确。无法将 存储在成本列中。预期类型为 Double。---> System.FormatException ..."
注意:“成本”是本地表中以这种方式定义的列的名称:
// Create temp table that mirrors InventoryItems as a staging area for the data to be bulk copied
var dt = new DataTable();
dt.Columns.Add(new DataColumn("Id", typeof(string)));
. . .
dt.Columns.Add(new DataColumn("Cost", typeof(double)));
. . .
因此,当检索到的数据具有这些虚假/空值时,我如何检查并使用诸如 0.00 表示双精度值、0 表示 int、string.empty 表示 String 等值?
为了查看何时发生这种情况,我在这一行放置了一个条件断点:
var unitCost = (Double)obj["Unit_Cost"];
...通过在断点条件对话框中输入以下内容:
unitCost.ToString() == ""
...但它永远无法到达。我还尝试将“unitCost == null”设置为条件断点,结果相同。
更新
有了这个:
id = (string)obj["Id"] ?? string.Empty;
packSize = (Int16)obj["PackSize"] ?? 0;
var description = (string)obj["Description"] ?? string.Empty;
var deptSubdept = (Double)obj["DeptDotSubdept"] ?? 0.0;
var unitCost = (Double)obj["Unit_Cost"] ?? 0.0;
var unitList = (Double)obj["Unit_List"] ?? 0.0;
var UPC_Code = (string)obj["UPC_code"] ?? string.Empty;
var UPC_packSize = (Int16)obj["UPC_pack_size"] ?? 0;
var CRVId = (Int32)obj["CRV_Id"] ?? 0;
...我明白了:
操作员 '??'不能应用于“short”和“int”类型的操作数 操作员 '??'不能应用于“double”和“double”类型的操作数 操作员 '??'不能应用于“int”和“int”类型的操作数
更新 2
我试过了:
double unitCost;
if (obj["Unit_Cost"] != DBNull.Value)
{
unitCost = (Double) obj["Unit_Cost"];
}
else
{
unitCost = 0.0;
}
...并得到,“运算符 '!=' 不能应用于类型为 'Newtonsoft.Json.Linq.JToken' 和 'System.DBNull' 的操作数”
更新 3
将条件赋值的初始部分包含在括号中,如下所示:
var UPC_Code = ((string)obj["UPC_code"]) ?? string.Empty;
...仅适用于字符串;对于其他数据类型(int 和 double),我仍然会收到错误消息。
更新 4
这段代码发生了运行时异常:
dt.Rows.Add(invItem.Id, invItem.PackSize, invItem.Description, invItem.DeptDotSubdept,
invItem.Unit_Cost, invItem.Unit_List, invItem.UPC_code, invItem.UPC_pack_size,
invItem.CRV_Id);
...所以我尝试了这个:
int packSize = 1;
double unitCost = 0.0;
double unitList = 0.0;
if (invItem.PackSize != null)
{
packSize = invItem.PackSize;
}
if (invItem.Unit_Cost != null)
{
unitCost = invItem.Unit_Cost;
}
if (invItem.Unit_List != null)
{
unitList = invItem.Unit_List;
}
dt.Rows.Add(invItem.Id, packSize, invItem.Description,
invItem.DeptDotSubdept, unitCost, unitList, invItem.UPC_code,
invItem.UPC_pack_size, invItem.CRV_Id);
...但它仍然失败,并且“!= null”行在编辑器中有蓝色波浪线的情况。
更新 5
关于 SLaks 的建议,我试过了:
if (obj["Unit_Cost"] == DBNull.Value)
{
unitCost = 0.0;
}
else
{
unitCost = (Double)obj["Unit_Cost"];
}
...但是得到,“运算符 '==' 不能应用于 'Newtonsoft.Json.Linq.JToken' 和 'System.DBNull' 类型的操作数”
我对此也有同样的看法:
if ((Double)obj["Unit_Cost"] == DBNull.Value)
....还有这个:
if (((Double)obj["Unit_Cost"]) == DBNull.Value)
更新 6
我看到当这失败时,unitCost 的值不是 null,而是 0。所以,我在分配该值的位置设置了一个断点:
unitCost == 0
...但是断点被命中,即使该值为 0.0(这很好)。我认为即使是 0 也可以,但是......它失败了,所以这个值显然有问题。
【问题讨论】:
-
你的断点不起作用,因为你没有设置
unitCost -
你怎么看?断点在这一行: var unitCost = (Double)obj["Unit_Cost"];
-
要更新:您需要括号,否则演员表(拆箱)在 空合并之前。
-
@JeppeStigNielsen:你的意思是把所有东西都封装到合并操作符上吗?
-
@ClayShannon:没错。直到之后该行运行,
unitCost尚未设置。而且您将无法将null、DBNull.Value或""转换为双精度。
标签: c# null double default-value argumentexception