不能进行隐式转换";“无效”;至“;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)
    {
    }
}

不能进行隐式转换";“无效”;至“;bool”;

由于您已将方法返回类型更改为类型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;
}