函数返回值,并非所有代码路径都返回

时间:2014-02-04 04:52:33

标签: c# function

嗨我有这样的代码

Global.dbCon.Open();
List<int> idQuestions = new List<int>();
kalimatSql = kalimatSql;
Global.reader = Global.riyeder(kalimatSql);
if (Global.reader.HasRows)
    while (Global.reader.Read())
    {
        int idQuestion = Convert.ToInt32(Global.reader.GetValue(0)); 
        idQuestions.Add(idQuestion);
    }
Global.dbCon.Close();
foreach (int id in idQuestions)
    messageBox.Show(id.ToString());

我尝试将其编辑为功能(类),所以我可以多次调用它

private int sqlReader(string kalimatSql)
{
    int sqlReader(string kalimatSql){
    Global.dbCon.Open();
    List<int> idQuestions = new List<int>();
    Global.reader = Global.riyeder(kalimatSql);
    if (Global.reader.HasRows)
        while (Global.reader.Read())
        {
            int idQuestion = Convert.ToInt32(Global.reader.GetValue(0));
            idQuestions.Add(idQuestion);
        }
    Global.dbCon.Close();
    foreach (int id in idQuestions)
        return id;
}

但它不起作用,因为并非所有代码路径都返回一个值......我想知道这样做的正确方法是什么?

7 个答案:

答案 0 :(得分:3)

代码的最后一部分有两个问题:

    foreach (int id in idQuestions) {
        return id;
    }
}

这里的主要问题是,如果idQuestions为空,则不会返回任何内容(这就是您收到此错误的原因)。但即使它不是空的,你的代码也会在你第一次进入foreach的主体时返回,因此只返回 ids 列表中的第一个元素。

我假设您要返回 ids 的完整列表,这很方便,因为您已经将它们全部放在List<>内。只需将您的代码更改为:

    return idQuestions;
}

完整的方法应如下所示(注意方法签名):

private List<int> sqlReader(string kalimatSql) {
    Global.dbCon.Open();
    List<int> idQuestions = new List<int>();
    Global.reader = Global.riyeder(kalimatSql);
    if (Global.reader.HasRows) {
        while (Global.reader.Read()) {
            int idQuestion = Convert.ToInt32(Global.reader.GetValue(0));
            idQuestions.Add(idQuestion);
        }
    }
    Global.dbCon.Close();

    //return the ids
    return idQuestions;
}

答案 1 :(得分:2)

发生此错误是因为,当您的上一个'foreach'循环运行零时,会发生什么(或返回)?在其他意义上,当您的'idQuestions'长度为零时,您的代码应返回什么值?

为了摆脱这种情况,您可以将此代码更改为

if(idQuestions.Count > 0)
{
    foreach (int id in idQuestions) {
       return id;
    }
}
else
    return -1;

答案 2 :(得分:1)

如果idQuestions中没有任何元素,该怎么办? foreach永远不会被执行。

我假设你从ur函数返回单个整数值

所以在foreach返回默认int之后。你的算法总是错误的。如果你实现第二个代码版本

,将只返回第一个ID
Global.dbCon.Open();
List<int> idQuestions = new List<int>();
int deft=0;
Global.reader = Global.riyeder(kalimatSql);
if (Global.reader.HasRows) {
  while (Global.reader.Read()) {
     int idQuestion = Convert.ToInt32(Global.reader.GetValue(0));
     idQuestions.Add(idQuestion);
  }
}
Global.dbCon.Close();
foreach (int id in idQuestions) {
  return id;
}

return deft;

答案 3 :(得分:1)

最后一行:

foreach (int id in idQuestions) {
    return id;
}

与说if (idQuestions.Count > 0) { return idQuestions[0]; }相同。

错误是因为您没有在代码流结束时返回值。在您的情况下,有很多方法可以解决此问题,但您需要弄清楚“默认”值是什么(例如null-1

您可以执行以下操作:

return (idQuestions.Count > 0 ? idQuestions[0] : -1)`

如果-1是有效的返回值,或者你的意图是返回整个数组(如果无效则返回null),你可以这样:

return (idQuestions.Count > 0 ? idQuestions : null)

希望可以提供帮助

答案 4 :(得分:1)

将return放在foreach循环中似乎非常错误。

如果您有多个结果,则可以返回IEnumerable

foreach(int id in idQuestions)
   yield return id;

答案 5 :(得分:1)

您的代码似乎试图从数据存储中获取一些ID。在这种情况下,根据您的代码,它将仅返回从您的数据存储返回的第一个元素的id。如果我理解你的问题,代码应该是这样的,

Global.dbCon.Open();
List<int> idQuestions = new List<int>();
Global.reader = Global.riyeder(kalimatSql);
if (Global.reader.HasRows) {
  while (Global.reader.Read()) {
     int idQuestion = Convert.ToInt32(Global.reader.GetValue(0));
     idQuestions.Add(idQuestion);
  }
}
Global.dbCon.Close();

return idQuestions;

答案 6 :(得分:0)

问题在于,您的唯一 return 语句位于 foreach 循环中,如果您枚举的列表为空,则永远不会执行该循环的内容。如果你要在列表中返回第一个值,为什么还有一个循环呢?