我正在将一些遗留代码从VB转换为C#,我收到错误:
无法将类型'object'隐式转换为'bool'类型。存在显式转换(您是否错过了演员?)
在if语句中的p2.Value = 1
。
这是VB中的代码
Public Function CheckforRatingRemoval() As Boolean
Dim param(2) As SqlParameter
Dim p1 As New SqlParameter("@interviewID", SqlDbType.Int)
p1.Value = _interviewID
param(0) = p1
Dim p2 As New SqlParameter("@flag", SqlDbType.Int)
p2.Direction = ParameterDirection.Output
param(1) = p2
EDJOINControls.EdjoinDatabase.ExecuteNonQuery("usp_checkInterviewRatingRemoval", param)
If p2.Value = 1 Then
Return True
Else
Return False
End If
End Function
这里它被转换为C#
public bool CheckforRatingRemoval()
{
SqlParameter[] param = new SqlParameter[2];
SqlParameter p1 = new SqlParameter("@interviewID", SqlDbType.Int);
p1.Value = _interviewID;
param[0] = p1;
SqlParameter p2 = new SqlParameter("@flag", SqlDbType.Int);
p2.Direction = ParameterDirection.Output;
param[1] = p2;
EdjoinDatabase.ExecuteNonQuery("usp_checkInterviewRatingRemoval", param);
if (p2.Value = 1)
{
return true;
}
else
{
return false;
}
}
答案 0 :(得分:5)
传统VB代码可能Option Strict Off
使其自动转换不匹配类型。对于缩小C#中的转换,这不会发生。 SqlParameter.Value
的类型为object
。明确地将其投放到int
。
return (int)p2.Value == 1;
第二个问题是使用=
。在C#=
中是赋值运算符(您不想在此使用)和==
等于运算符。
请不要写
if ((int)p2.Value == 1) {
return true;
} else {
return false;
}
比较(int)p2.Value == 1
的结果是true
或false
,您可以直接返回此值!你不写if (x == 1) return 1; else if (x == 2) return 2; else if (x == 3) return 3; else ....
,你写return x;
。
顺便说一下:有几个online VB to C# converters可以为你节省很多时间。
答案 1 :(得分:2)
在Visual Basic代码中,编译器隐式转换为所需类型,因此没有编译错误。另一方面,由于您正在执行Object
类型的相等比较(p2.Value
返回类型Object
)而int
因此C#
需要您明确地施展它。
所以,你的代码应该是:
return (int)p2.Value == 1;
另外,请注意使用double equal运算符进行相等比较。
答案 2 :(得分:1)
这是摆脱错误的原因
if (Convert.ToInt32(p2.Value) == 1)
{
return true;
}
else
{
return false;
}
答案 3 :(得分:0)
在C#中,if语句基本上简化为if (true)
或if (false)
。运算符==
返回true或false。运算符=
设置一个值。如果您尝试说if (1 + 1 = 2)
,该程序将不知道该怎么做,因为它不会简化为真或假,因此会抛出错误。
tl; dr在if语句中使用==
而不是=
。
答案 4 :(得分:-1)
应该是
if (p2.Value == 1)
{
return true;
}
else
{
return false;
}
with double ==