执行下面的代码时,我在控制器中收到此错误:
无法隐式转换类型“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
只是 Model 类上的 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>
所以,我想要的是,我需要在控制器中将
t.TOT_QTY
的类型从 int?
改为 int
,或者在视图页面上将 var itotqty = 0;
从 int
改为 int?
。
如何做到这一点?
将更改保留在模型中,然后保留在视图中
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);
我有以下疑问,
(from p in _dbContext.MyTable
where batchIds.Contains(p.BatchId)
select new ParticipantToRespond
{
ParticipantId = p.ParticipantId,
TeamId = (p.TeamId ?? 0),
}).ToList();
出现“转换为值类型“System.Int32”失败,因为具体化值为 null。结果类型的泛型参数或查询必须使用可为 null 的类型。” TeamId = (p.TeamId ?? 0) 的例外情况
我尝试了下面提到的代码更改,但对我来说没有任何作用
(p.TeamId.HasValue) ? p.TeamId.Value : 0,
(p.TeamId ?? 0),
p.TeamId ?? default(int);
(int)(p.TeamId ?? 0);
p.TeamId == null ? 0: p.TeamId.Value
任何指导将不胜感激