【问题标题】:Error in use of Conditional Operator条件运算符使用错误
【发布时间】:2013-12-18 10:14:25
【问题描述】:

我的代码是这样的:

if (statusCode== "1")
{
    statusCode = productStatusItemAvailable1;
}
else if(statusCode =="2")
{
    statusCode = productStatusItemOutOfStock1;
}
 else if(statusCode =="3")
{
    statusCode = productStatusItemAvailableOnRemoteDate1;
}
else if(statusCode =="4")
{
    statusCode = productStatusAlternativeItemAvailable1;
}
else if(statusCode =="5")
{
    statusCode = productStatusItemSoldOutAndOurSuppliersHaveNoAvailable;
}
else if(statusCode =="6")
{
    statusCode = productStatusItemSoldOutContactCustomerService1;
}

为了使其更具可读性和易于处理,我尝试应用三元运算符

statusCode == "1"  ? productStatusItemAvailable1: "2" ? productStatusItemOutOfStock1 : "3" ? productStatusItemAvailableOnRemoteDate1  : "4"  ? productStatusAlternativeItemAvailable1 : "5" ? productStatusItemSoldOutAndOurSuppliersHaveNoAvailable : "6" ? productStatusItemSoldOutContactCustomerService1;

但这显示错误

不能将字符串隐式转换为布尔值。

我做错了什么?还是不能与字符串一起使用?

【问题讨论】:

  • 三元运算符的意思是“具有三个操作数的运算符”。如果您尝试将整个系列的三元运算符链接在一起以逐个与一组值进行比较,那么您可能没有按预期使用三元条件运算符。您绝对应该使用开关/外壳。
  • 嗯,第二个你没有检查statusCode=="2" 你刚才说的是“2”,这是没有意义的
  • 哇。你听说过switch吗?
  • 为您的错误代码创建一个枚举并在 switch 语句之前解析“数字”将使代码更易于维护和阅读。

标签: c# conditional-operator


【解决方案1】:

正如所指出的,您没有根据字符串检查值。也就是说,您绝对应该为此使用 switch 语句:

switch(statusCode)
{

    case "1":
        // do some stuff
    break;

    // etc...
}

虽然理想情况下,statusCode 应该是一个枚举,其中每个值对应于错误,但它会使您的代码更清晰。

【讨论】:

    【解决方案2】:

    每个条件都需要statuscode ==

    statusCode == "1" ? product1 : statusCode == "2" ? product2 ...等

    【讨论】:

    • 他没有赋值返回值。
    【解决方案3】:

    ?: Ternary 的语法是:

    object result = bool ? object : object;
    

    在您的代码中,您没有在 : 范围之后定义任何内容,要像这样使用,您可以在 : 之后定义另一个三元范围并再次应用它,例如:

      statusCode  = statusCode == "1" ? productStatusItemAvailable1 : 
                    statusCode == "2" ? productStatusItemOutOfStock1 : 
                    statusCode == "3" ? productStatusItemAvailableOnRemoteDate1 : 
                    statusCode == "4" ? productStatusAlternativeItemAvailable1 : 
                    statusCode == "5" ? productStatusItemSoldOutAndOurSuppliersHaveNoAvailable : 
                    statusCode == "6" ? productStatusItemSoldOutContactCustomerService1 
                    : stirng.Empty;
    

    三元的最后一个: 范围,就像if 结构的最后一个else 语句。您必须为其定义一个值作为default 值,因为它是三元运算符结构的一部分。

    【讨论】:

      【解决方案4】:

      使用switch statement 或字典可能会更好:

      var statusCodes = new Dictionary<string, string>{};
      statusCodes.Add("1", productStatusItemAvailable1); // For each message
      

      现在您可以使用密钥获取每条消息:

      // Will return value of productStatusItemAvailable1:
      var result = statusCodes["1"]; 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-27
        • 2017-10-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-05
        相关资源
        最近更新 更多