无法将类型“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类型,或者在视图页面上从intint?进行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);