【问题标题】: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;
}

【问题讨论】:

    标签: c# executescalar


    【解决方案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;,应该注意它。
    • 好的,我马上就解决了;但是,现在我遇到了另一个问题。 stackoverflow.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
                    猜你喜欢
                    • 2011-12-24
                    • 2018-03-30
                    • 1970-01-01
                    • 1970-01-01
                    • 2021-07-27
                    • 1970-01-01
                    • 1970-01-01
                    • 2013-06-12
                    • 1970-01-01
                    相关资源
                    最近更新 更多