为什么我在 foreach 中使用 if 时得到 "Not All paths return a value"
Why Am I getting "Not All paths return a value" when using if inside a foreach
我正在尝试 return 找到字符串匹配后的值。我正在使用以下代码。
MetadataIcons mi = new MetadataIcons();
Type me = mi.GetType();
PropertyInfo[] pi = me.GetProperties();
foreach (var property in pi)
if (property.Name.ToLower().Equals(prop.ToLower()))
return property.GetValue(prop).ToString();
但是,我收到错误 "Not all paths return a value" 我以为我可以那样做。我真的需要指定一个 return 变量吗?
试试这个:
MetadataIcons mi = new MetadataIcons();
Type me = mi.GetType();
PropertyInfo[] pi = me.GetProperties();
string somevalue = "";
foreach (var property in pi){
if (property.Name.ToLower().Equals(prop.ToLower())){
somevalue = property.GetValue(prop).ToString();}
}
return somevalue;
正如@SLaks 在评论中指出的那样,在理论上存在代码可能没有 return 任何值的情况。在实践中这些可能永远不会发生,但编译器只知道它看到了什么,并且它看到了这种可能性。
场景:
pi
是一个空数组,所以我们永远不会进入foreach循环。
- none 个
property
值的名称等于给定的 prop
值。
下面的代码 return 是预期的结果(如果找到的话)。
但是,如果发生上述任何一种情况,它会继续 运行(因为它不会在 return 语句中退出),因此会进入新行 throw new NotImplementedException
...;这会导致抛出错误。
MetadataIcons mi = new MetadataIcons();
Type me = mi.GetType();
PropertyInfo[] pi = me.GetProperties();
foreach (var property in pi)
if (property.Name.ToLower().Equals(prop.ToLower()))
return property.GetValue(prop).ToString();
throw new NotImplementedException("I haven't yet decided what to do should this condition arise.");
在这里抛出一个错误是一个有效的动作(也就是说,如果我们出错了,我们有一个不同的有效路径来退出我们不需要 return 值的函数),所以编译器现在很高兴。
然而,这可能不是您想要的行为(即,您可能想要 return 一个默认值(例如 null
),或者您可能想抛出不同类型的错误/执行一些其他操作。
当您在 c# 中声明一个函数具有 return 值时,您 必须 return 相同数据类型的东西,否则会引发异常。您的代码缺少 "else
" 情况,因此您没有 returning 任何东西。如果您想要一个默认值,请明确将其放在您的“else
”中。否则,您可能想要声明一个 ApplicationException
并抛出它(在某种程度上这算作一个 return 值)。
根据你的具体情况,最好先声明一个变量,然后使用循环为其赋值,然后return那个。如果您初始化它,这将跳过对 else
的需要。
string retval = string.Empty;
foreach (var property in pi)
if (property.Name.ToLower().Equals(prop.ToLower()))
{
retval = property.GetValue(prop).ToString();
break; //stop looping
}
return retval;
您也可以使用!否定 if
布尔结果并这样做:
string retval = string.Empty;
foreach (var property in pi)
{
if (!(property.Name.ToLower().Equals(prop.ToLower())))
{
continue; //jump out of this iteration and go to the next
}
retval = property.GetValue(prop).ToString();
}
return retval;
我正在尝试 return 找到字符串匹配后的值。我正在使用以下代码。
MetadataIcons mi = new MetadataIcons();
Type me = mi.GetType();
PropertyInfo[] pi = me.GetProperties();
foreach (var property in pi)
if (property.Name.ToLower().Equals(prop.ToLower()))
return property.GetValue(prop).ToString();
但是,我收到错误 "Not all paths return a value" 我以为我可以那样做。我真的需要指定一个 return 变量吗?
试试这个:
MetadataIcons mi = new MetadataIcons();
Type me = mi.GetType();
PropertyInfo[] pi = me.GetProperties();
string somevalue = "";
foreach (var property in pi){
if (property.Name.ToLower().Equals(prop.ToLower())){
somevalue = property.GetValue(prop).ToString();}
}
return somevalue;
正如@SLaks 在评论中指出的那样,在理论上存在代码可能没有 return 任何值的情况。在实践中这些可能永远不会发生,但编译器只知道它看到了什么,并且它看到了这种可能性。
场景:
pi
是一个空数组,所以我们永远不会进入foreach循环。- none 个
property
值的名称等于给定的prop
值。
下面的代码 return 是预期的结果(如果找到的话)。
但是,如果发生上述任何一种情况,它会继续 运行(因为它不会在 return 语句中退出),因此会进入新行 throw new NotImplementedException
...;这会导致抛出错误。
MetadataIcons mi = new MetadataIcons();
Type me = mi.GetType();
PropertyInfo[] pi = me.GetProperties();
foreach (var property in pi)
if (property.Name.ToLower().Equals(prop.ToLower()))
return property.GetValue(prop).ToString();
throw new NotImplementedException("I haven't yet decided what to do should this condition arise.");
在这里抛出一个错误是一个有效的动作(也就是说,如果我们出错了,我们有一个不同的有效路径来退出我们不需要 return 值的函数),所以编译器现在很高兴。
然而,这可能不是您想要的行为(即,您可能想要 return 一个默认值(例如 null
),或者您可能想抛出不同类型的错误/执行一些其他操作。
当您在 c# 中声明一个函数具有 return 值时,您 必须 return 相同数据类型的东西,否则会引发异常。您的代码缺少 "else
" 情况,因此您没有 returning 任何东西。如果您想要一个默认值,请明确将其放在您的“else
”中。否则,您可能想要声明一个 ApplicationException
并抛出它(在某种程度上这算作一个 return 值)。
根据你的具体情况,最好先声明一个变量,然后使用循环为其赋值,然后return那个。如果您初始化它,这将跳过对 else
的需要。
string retval = string.Empty;
foreach (var property in pi)
if (property.Name.ToLower().Equals(prop.ToLower()))
{
retval = property.GetValue(prop).ToString();
break; //stop looping
}
return retval;
您也可以使用!否定 if
布尔结果并这样做:
string retval = string.Empty;
foreach (var property in pi)
{
if (!(property.Name.ToLower().Equals(prop.ToLower())))
{
continue; //jump out of this iteration and go to the next
}
retval = property.GetValue(prop).ToString();
}
return retval;