不能隐式转换类型“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。所以User
和OrdersPerHour
将是user
和ordersPerHour
。
【讨论】:
【参考方案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'。的主要内容,如果未能解决你的问题,请参考以下文章
windows编程问题 错误提示“int无法隐式转换为bool”
为啥 int 被提升为 double 而不是 float 以进行隐式转换