嗨我有这样的代码
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;
}
但它不起作用,因为并非所有代码路径都返回一个值......我想知道这样做的正确方法是什么?
答案 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之后。你的算法总是错误的。如果你实现第二个代码版本
,将只返回第一个IDGlobal.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 循环中,如果您枚举的列表为空,则永远不会执行该循环的内容。如果你要在列表中返回第一个值,为什么还有一个循环呢?