3

我在 C# 中创建了一个方法,如下所示

public static IEnumerable<User> QueryTheAD(string filter, string identifier) {
  if ( filter == "ANiceString" ) {
    // sexy code here
  }
}

效果很好。但是 VS 正确地表明并非所有代码路径都返回一个值。

因此,我是否可以指定过滤器只能是以下之一:

  • “导师”
  • “年”
  • “第二个名字”
4

6 回答 6

15

也许您应该使用枚举而不是字符串?:)

enum filterEnum
{
   Tutor,
   Year,
   SecondName
}

public static IEnumerable<User> QueryTheAD(filterEnum filter, string identifier) 

享受 ;)

于 2012-05-09T17:48:18.850 回答
7

ArgumentException如果传递了无效字符串,则使用枚举或抛出一个。

虽然枚举只映射到数字,但您始终可以将枚举值映射到字符串,以防出于某种原因需要字符串名称。

于 2012-05-09T17:48:41.917 回答
4

不,不允许这种类型的编译时间限制。该方法的实现必须处理所有string值。如果一个不符合该方法的合同,那么你应该抛出一个异常

于 2012-05-09T17:49:05.937 回答
3

无效参数的正常行为是抛出 ArgumentException。

于 2012-05-09T17:48:46.157 回答
2

简单怎么样switch

public static IEnumerable<User> QueryTheAD(string filter, string identifier) {
    switch (filter)
    {
        case "Tutor":
            //code here  
            break;

        case "Year":
            //code here  
            break;

        case "SecondName":
            //code here  
            break;

        default:
            throw new ArgumentException("filter", "Unacceptable value of filter");
    }
}
于 2012-05-09T17:50:53.867 回答
1

答案取决于不是这三个字符串之一时filter的行为。

如果需要其中之一,您应该抛出 ArgumentException:

public static IEnumerable<User> QueryTheAD(string filter, string identifier) 
{
    if(filter != "Tutor" || filter != "Year" || filter != "SecondName") throw new ArgumentException ("filter");

    // sexy code here
}

或使用 anenum来要求所需的值之一:

public enum LegalValues { Tutor = 1, Year = 2, SecondName = 3 }

public static IEnumerable<User> QueryTheAD(LegalValues filter, string identifier)
{
     // sexy code here
}
于 2012-05-09T17:51:22.117 回答