不能隐式转换类型“int?”到'int'。

Posted

技术标签:

【中文标题】不能隐式转换类型“int?”到\'int\'。【英文标题】:Cannot implicitly convert type 'int?' to 'int'.不能隐式转换类型“int?”到'int'。 【发布时间】:2013-05-23 18:59:40 【问题描述】:

我收到错误“无法隐式转换类型'int?'到“int”。在返回行的 OrdersPerHour 上存在显式转换(您是否缺少演员表?)。我不知道为什么,因为我的 C# 技能不是那么先进。任何帮助将不胜感激。

static int OrdersPerHour(string User)

    int? OrdersPerHour;
    OleDbConnection conn = new OleDbConnection(strAccessConn);
    DateTime curTime = DateTime.Now;        

    try
    
        string query = "SELECT COUNT(ControlNumber) FROM Log WHERE DateChanged > #" + curTime.AddHours(-1) + "# AND User = '" + User + "' AND Log.EndStatus in ('Needs Review', 'Check Search', 'Vision Delivery', 'CA Review', '1TSI To Be Delivered');";
        OleDbCommand dbcommand = new OleDbCommand(query, conn);
        dbcommand.Connection.Open();
        dbcommand.CommandType = CommandType.Text;
        OrdersPerHour = (int?)dbcommand.ExecuteScalar();

        Console.WriteLine("Orders per hour for " + User + " is " + OrdersPerHour);            
    
    catch (OleDbException ex)
    

    
    finally
    
        conn.Close();
    
    return OrdersPerHour;

【问题讨论】:

【参考方案1】:

好吧,您将OrdersPerHour 转换为int?

OrdersPerHour = (int?)dbcommand.ExecuteScalar();

然而你的方法签名是int:

static int OrdersPerHour(string User)

两者必须匹配。


也是一个快速建议 -> 在查询中使用参数,例如:

string query = "SELECT COUNT(ControlNumber) FROM Log WHERE DateChanged > ? AND User = ? AND Log.EndStatus in ('Needs Review', 'Check Search', 'Vision Delivery', 'CA Review', '1TSI To Be Delivered')";
OleDbCommand dbcommand = new OleDbCommand(query, conn);
dbcommand.Parameters.Add(curTime.AddHours(-1));
dbcommand.Parameters.Add(User);

【讨论】:

我现在明白我在这方面的错误了。但在进行这些更改后,我在返回行收到“未分配局部变量 'OrdersPerHour' 的用户。 @MaylorTaylor 将int? OrdersPerHour; 更改为int OrdersPerHour = 0;,应该注意它。 好的,我马上就解决了;但是,现在我遇到了另一个问题。 ***.com/questions/16744510/…【参考方案2】:

这是因为你的方法的返回类型是 int 而 OrdersPerHour 是 int? (nullable) ,您可以通过返回它的值来解决这个问题,如下所示:

return OrdersPerHour.Value

还要检查它是否不为空以避免异常,如下所示:

if(OrdersPerHour != null)


    return OrdersPerHour.Value;


else


  return 0; // depends on your choice


但在这种情况下,您必须在 else 部分或 if 部分之后返回一些其他值,否则编译器将标记一个错误,并非所有代码路径都返回值。

【讨论】:

【参考方案3】:
Int32 OrdersPerHour = 0;
OrdersPerHour = Convert.ToInt32(dbcommand.ExecuteScalar());

【讨论】:

【参考方案4】:

您的代码遇到的第一个问题是消息

访问前可能未初始化局部变量 OrdersPerHour。

发生这种情况是因为在您的数据库查询会引发异常的情况下,该值可能未设置为某个值(您有一个空的 catch 子句)。

要解决此问题,请将值设置为查询失败时想要的值,这可能是0

int? OrdersPerHour = 0;

一旦这个问题得到解决,现在就会出现您发布的错误。发生这种情况是因为您的方法签名声明您正在返回一个 int,但实际上您正在返回一个可为空的 int int? 变量。

所以要获得int?int 部分,您可以使用.Value 属性:

return OrdersPerHour.Value;

但是,如果您在开始时将 OrdersPerHour 声明为 null 而不是 0,则该值可以为 null,因此可能需要在返回之前进行适当的验证(例如,引发更具体的异常)。

为此,您可以使用HasValue 属性来确保在返回之前您有一个值:

if (OrdersPerHour.HasValue)
    return OrdersPerHour.Value;

else
    // Handle the case here


附带说明,由于您使用 C# 进行编码,因此最好遵循 C# 的约定。您的参数和变量应该是驼峰式,而不是 PascalCase。所以UserOrdersPerHour 将是userordersPerHour

【讨论】:

【参考方案5】:

您可以将最后一行更改为以下(假设您想在db中没有任何内容时返回0):

return OrdersPerHour == null ? 0 : OrdersPerHour.Value;

【讨论】:

【参考方案6】:

检查变量的声明。应该是这样的

public Nullable<int> x get; set;
public Nullable<int> y get; set;
public Nullable<int> z get  return x*y; 

希望对你有用

【讨论】:

【参考方案7】:

您的方法的返回类型是int,而您正尝试返回int?

【讨论】:

【参考方案8】:

OrdersPerHour = (int?)dbcommand.ExecuteScalar();

此语句应输入为, OrdersPerHour = (int)dbcommand.ExecuteScalar();

【讨论】:

【参考方案9】:

如果您担心null 可能的返回值,您也可以运行以下代码:

int ordersPerHour;  // can't be int? as it's different from method signature
// ... do stuff ... //
ordersPerHour = (dbcommand.ExecuteScalar() as int?).GetValueOrDefault();

通过这种方式,您可以处理潜在的意外结果,还可以通过输入 .GetValueOrDefault(-1) 或对您更有意义的内容为表达式提供默认值。

【讨论】:

【参考方案10】:

简单

(i == null) ? i.Value : 0;

【讨论】:

虽然这在理论上可能有效,但它并没有向任何人解释它是如何工作的。说“简单”是不够的。 ..它肯定行不通。当i == null 时你有一个NullReferenceException,当它不是时返回0

以上是关于不能隐式转换类型“int?”到'int'。的主要内容,如果未能解决你的问题,请参考以下文章

无法将类型 double 隐式转换为 int

windows编程问题 错误提示“int无法隐式转换为bool”

为啥 int 被提升为 double 而不是 float 以进行隐式转换

C语言 显式 隐式是啥意思

C#错误(无法将类型'string'隐式转换为'int')[重复]

无法将类型“int”隐式转换为 dbDataSet