【问题标题】:Error : The Out Parameter must be assigned before control leaves the current method错误:必须在控制离开当前方法之前分配 Out 参数
【发布时间】:2012-07-29 02:20:22
【问题描述】:

发回参数时出现此错误

错误:必须在控制离开之前分配 Out 参数 当前方法

代码是

 public void GetPapers(string web, out int Id1, out int Id2)
    {
        SqlConnection conn = new SqlConnection(ConnectionString());
        conn.Open();
        SqlCommand cmd = new SqlCommand("GetPapers", conn);
        cmd.CommandType = CommandType.StoredProcedure;

        cmd.Parameters.Add(new SqlParameter("@URL", String(web)));

        SqlDataReader rdr = cmd.ExecuteReader();

        if (rdr.Read())
        {
            Id1 = (int)rdr["ID1"];
            Id2 = (int)rdr["ID2"];
        }

        rdr.Close();
    }

称之为

GetPapers(web, out Id1, out Id2);

与这个问题有关

Related question

【问题讨论】:

  • 必须在控制离开方法之前沿所有路径分配输出参数。由于您有 if 语句,因此它们可能不会被分配。
  • 如果rdr.Read() 返回 false,您希望这些值是什么?
  • @JonSkeet 代码仅在数据库中有某些内容时才有效,它就像一个事件接收器
  • @fdgfdgsdfg:所以也许你应该在数据库中没有任何内容时抛出异常?
  • @JonSkeet 是的,我稍后会进行验证:)

标签: c# compiler-errors .net-2.0


【解决方案1】:

您在 if 语句中分配 Id1Id2 并且编译器无法确定它是否会在运行时分配一个值,因此出现错误。

您可以在 if 语句之前为它们分配一些默认值。就像是。

Id1 = 0;
Id2 = 0;

if (rdr.Read())
{
    Id1 = (int)rdr["ID1"];
    Id2 = (int)rdr["ID2"];
}

或在else 部分条件中指定一些默认值。

out 类型参数必须在控件离开函数之前分配一些值。在您的情况下,编译器无法确定您的变量是否将被分配,因为它是在 if 语句中分配的。

见:5.3 Definite assignment

在函数成员的可执行代码中的给定位置, 如果编译器可以 证明,通过静态流分析,变量已经 自动初始化或已成为至少一个目标 任务。

【讨论】:

  • 哇,这看起来超级破,为什么他们会做出这样的设计选择?
【解决方案2】:

你需要初始化那些变量;

它必须在从 Getpapers() 方法返回之前保存一些值

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-05
    • 2020-01-16
    • 1970-01-01
    相关资源
    最近更新 更多