我试图在找到字符串匹配后返回一个值。我正在使用以下代码。
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();
但是,我收到错误“并非所有路径返回值”我认为我能够这样做。我真的需要特定一个返回变量吗?
答案 0 :(得分:3)
正如@SLaks在评论中指出的那样,理论情况下代码可能不会返回任何值。在实践中,这些可能永远不会发生,但编译器只知道它看到了什么,并且它看到了这种可能性。
方案:
pi
是一个空数组,因此我们永远不会进入foreach循环。property
个值中没有一个名称等于给定的prop
值。以下代码返回预期结果(如果找到)。
但是,如果出现上述任一情况,它将继续运行(因为它不会在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.");
抛出错误是一个有效的操作(即好像我们错误,我们有一个不同的有效路由退出我们不需要返回值的函数),所以编译器现在很高兴。
但是,这可能不是您想要的行为(即您可能想要返回默认值(例如null
),或者您可能想要抛出不同类型的错误/执行其他操作。
答案 1 :(得分:3)
当您声明函数在c#中具有返回值时,必须返回相同数据类型的内容或抛出异常。您的代码缺少“else
”情况,因此您不会返回任何内容。如果您需要默认值,请将其明确放在“else
”中。否则,您可能需要声明ApplicationException
并抛出它(在某种程度上计为返回值)。
在您的特定情况下,最好先声明一个变量,然后使用循环来赋值,然后返回它。如果您初始化它,则会跳过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;
答案 2 :(得分:2)
试试这个:
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;