无法将类型“int?”隐式转换为“int” - 无论是在控制器上还是在视图页面上
本文关键字:int 控制器 视图 无论是 转换 类型 | 更新日期: 2023-09-27 18:34:39
在执行下面的代码时,我在控制器中遇到了此错误:
无法将类型"int?"隐式转换为"int"。存在显式转换(您是否缺少强制转换?
我的控制器t.TOT_QTY
出现错误。
控制器:
dcms = (from t in db.ASN_ITEM
...
where
(t.TOT_QTY - t.SCND_QTY) != 0
select new ASNVarianceRep
{
TOT_QTY = t.TOT_QTY,
SCND_QTY = t.SCND_QTY,
VAR_QTY = (t.SCND_QTY - t.TOT_QTY)
}).Distinct();
其中t.TOT_QTY
在数据库中属于 int?
类型。但是变量TOT_QTY
只是模型类上的一个int
。
型:
public class ASNVarianceRep : ASN_ITEM
{
public int TOT_QTY { get; set; }
...
}
如果我把public int TOT_QTY { get; set; }
改成public Nullable<int> TOT_QTY { get; set; }
,那么控制器中的错误就解决了。但是同样的错误将出现在第 itotqty = itotqty + item.TOT_QTY;
行的视图页面上
视图:
@if (Model != null)
{
var itotqty = 0;
foreach (var item in Model)
{
itotqty = itotqty + item.TOT_QTY;
<tr>
<td>
@Html.DisplayFor(modelItem => item.TOT_QTY)
</td>
...
</tr>
}
<tr>
<td style="text-align: center"><b>@itotqty.ToString() </b></td>
</tr>
因此,我想要的是我需要在控制器中从int?
到int
制作t.TOT_QTY
类型,或者在视图页面上从int
到int?
进行var itotqty = 0;
。怎么做?
将更改保留在模型中,然后在视图中
totqty = itotqty + Convert.ToInt32(item.TOT_QTY);
分配给模型时,可以显式转换为查询中的int
。目前,它正在尝试将隐式强制转换为失败。
dcms = (from t in db.ASN_ITEM
...
where
(t.TOT_QTY - t.SCND_QTY) != 0
select new ASNVarianceRep
{
TOT_QTY = (int)t.TOT_QTY,
SCND_QTY = t.SCND_QTY,
VAR_QTY = (t.SCND_QTY - t.TOT_QTY)
}).Distinct();
有关显式强制转换的详细信息,请参阅此 MSDN 页面:https://msdn.microsoft.com/en-us/library/ms173105.aspx
int?
和int
基本上是两种不同的类型,你不能隐式转换为,所以你需要做一个显式强制转换。显式强制转换如下所示:
int myInt = 3;
byte myByte = (Byte)myInt;
(Byte)
将int
投射到byte
的地方.它通过创建一个新变量,形成一个隐藏操作,然后返回该值来实现这一点,就像一个函数一样。
要通过您的示例执行此操作,它看起来像这样:
dcms = (from t in db.ASN_ITEM
...
where
(t.TOT_QTY - t.SCND_QTY) != 0
select new ASNVarianceRep
{
TOT_QTY = (int)t.TOT_QTY,
SCND_QTY = t.SCND_QTY,
VAR_QTY = (t.SCND_QTY - t.TOT_QTY)
}).Distinct();
但请记住,当您从Type?
转换为Type
时,如果将null
值转换为int
,则始终有可能丢失记忆。我不确定null
值被转换为什么,也许0
,但关键是,您已经丢失了该数据。
我建议您保持模型属性可为空
public Nullable<int> TOT_QTY { get; set; }
或
public int? TOT_QTY { get; set; }
并在您的视图中处理它
itotqty = itotqty + (int)(item.TOT_QTY ?? 0);
您还可以通过以下方式将可为空的 int 转换为 int
int temp= t.TOT_QTY ?? default(int);