无法隐式转换类型“int”?到“int” - 在控制器上或在视图页面上

问题描述 投票:0回答:6

执行下面的代码时,我在控制器中收到此错误:

无法隐式转换类型“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?
。 如何做到这一点?

c# entity-framework asp.net-mvc-4
6个回答
3
投票

将更改保留在模型中,然后保留在视图中

 totqty = itotqty + Convert.ToInt32(item.TOT_QTY);

2
投票

在分配给模型时,您可以在查询中显式转换为

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


1
投票

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
,但重点是,您已经丢失了该数据。


1
投票

我建议你保持你的模型属性可以为空

public Nullable<int> TOT_QTY { get; set; }

public int? TOT_QTY { get; set; }

并在你的视野中处理它

itotqty = itotqty + (int)(item.TOT_QTY ?? 0);

0
投票

您还可以通过以下方式将可空 int 转换为 int

int temp= t.TOT_QTY ?? default(int);

0
投票

我有以下疑问,

(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

任何指导将不胜感激

© www.soinside.com 2019 - 2024. All rights reserved.