不能进行隐式转换";“无效”;至“;bool”;
本文关键字:bool 无效 quot 转换 不能 | 更新日期: 2023-09-27 18:19:32
有人能告诉我我的代码出了什么问题吗?第一个函数与第二个函数位于不同的aspx文件中。
protected void btnManageUsersAddUser_Click(object sender, EventArgs e)
{
if (clsDataLayer.SaveUser(Server.MapPath("PayrollSystem_DB.mdb"), txtManageUsersName.Text, txtManageUsersPassword.Text, ddlSecurityLevel.SelectedValue))
{
lblAddUserMsg.Text = "The user was successfully added";
grdManagePersonnel.DataBind();
}
else
{
lblAddUserMsg.Text = "The user was not successfully added";
}
下面的函数最初是"bool"而不是"void",但我的教授告诉我把它改为"void"是因为错误,不是所有函数都返回值。
public static void SaveUser(string Database, string UserName, string UserPassword, string SecurityLevel)
{
bool recordSaved;
try
{
// Create connection
OleDbConnection conn = new OleDbConnection("PROVIDER=Microsoft.Jet.OLEDB.4.0;" +
"Data Source=" + Database);
conn.Open();
OleDbCommand command = conn.CreateCommand();
string strSQL;
// Insert to tblUserLogin
strSQL = "Insert into tblUserLogin " +
"(UserName, UserPassword, SecurityLevel) values ('" +
UserName + "', '" + UserPassword + "', '" + SecurityLevel + "')";
// Process data
command.CommandType = CommandType.Text;
command.CommandText = strSQL;
// Add your comments here
command.ExecuteNonQuery();
// Closes the transaction when true
conn.Close();
recordSaved = true;
}
catch (Exception ex)
{
}
}
由于您已将方法返回类型更改为类型void,因此您不能再在此处的条件语句中使用它:
if (clsDataLayer.SaveUser(Server.MapPath("PayrollSystem_DB.mdb"),
txtManageUsersName.Text, txtManageUsersPassword.Text, ddlSecurityLevel.SelectedValue))
条件需要将表达式简化为布尔值。
您的教授可能有一个观点,即并非所有路径都在您的代码的前一版本中返回值。如果方法返回布尔值,则需要确保所有路径都返回true或false值。例如,您可以修改代码以再次返回布尔值,并返回以下值:
...
return true;
}
catch (Exception ex)
{
return false;
}
...
请注意,我删除了"recordSaved"变量,因为它是不必要的;如果你只在那一个地方使用它,我建议你返回真/假值本身。
是的,您将其更改为不返回任何内容,但您仍然希望它返回某些内容,因为您仍在尝试使用结果:
if (clsDataLayer.SaveUser( ...
要么改变这种期望(失去向调用者返回有价值信息的能力),要么返回到原始版本并确保所有代码路径都返回一个值。
你教授的建议类似于:
你:我的车爆胎了
教授:好吧,把轮胎取下来。
你:呃,现在我的车还是走不了。
虽然教授建议去掉爆胎确实解决了眼前的问题(因为你的车不再有爆胎了),但这并不是一个足够的解决方案。在不了解问题的根本原因(a)的情况下更改事物经常会导致您当前所处的情况。
你的教授应该建议你理解为什么你会出现错误,并修复,而不是选择在其他地方产生影响的快速修复。
(a)这个问题的根本原因不是你的值返回布尔值,而是因为调用者期望的和被调用者提供的不匹配。
我不同意你教授的建议。将方法的返回类型更改为void,因为所有路径都不返回值,这就像在受感染的伤口上打绷带,并期望伤口愈合。
IMO的一个更好的解决方案是确保do的所有路径都返回一个值(true或false)。
例如,在您的方法中,更改:
bool recordSaved;
至:
bool recordSaved = false;
然后,如果在try
部分的末尾(在catch
行之前),添加:
recordSaved = true;
然后在退出方法之前返回recordSaved
:
return recordSaved;
有了这些更改,您的方法将把recordSaved
值设置为false;只有当记录被保存时,它才会被设置为true。然后您可以返回该值,并在if
检查中使用该方法。
完整的代码看起来像这样:
public static bool SaveUser(string Database, string UserName, string UserPassword, string SecurityLevel)
{
bool recordSaved = false;
try
{
// do your save
recordSaved = true;
}
catch (Exception ex)
{
// Handle the exception (logging, etc)
}
return recordSaved;
}