代码之家  ›  专栏  ›  技术社区  ›  MPelletier

条件运算符不能隐式强制转换?

  •  58
  • MPelletier  · 技术社区  · 16 年前

    给定变量:

    Boolean aBoolValue;
    Byte aByteValue;
    

    if (aBoolValue) 
        aByteValue = 1; 
    else 
        aByteValue = 0;
    

    但这不会:

    aByteValue = aBoolValue ? 1 : 0;
    

    错误说明:“无法将类型“int”隐式转换为“byte”。”

    aByteValue = aBoolValue ? (byte)1 : (byte)0;
    

    这是怎么回事?

    编辑:

    3 回复  |  直到 16 年前
        1
  •  69
  •   Eric Lippert    16 年前

    这是一个相当常见的问题。

    在C#中,我们几乎总是从内到外进行推理。当你看到

    x = y;
    

    我们计算出x的类型,y的类型,y的类型是否与x相容。但是当我们计算y的类型时,我们不使用我们知道x的类型这一事实。

    void M(int x) { }
    void M(string x) { }
    ...
    M(y); // y is assigned to either int x or string x depending on the type of y
    

    能够计算出表达式的类型 没有 知道它被分配给什么。类型信息流 出来 一个表达式,而不是 进入 表情。

    所有这些规则的例外是lambda表达式,其中包含类型信息 做 从上下文流到lambda。要正确理解这一逻辑是非常困难的。

        2
  •  12
  •   John Knoeller    16 年前

    我用的是VS2005,我可以复制,用于bool&布尔值,但不是真的

     bool abool = true;
     Boolean aboolean = true;
     Byte by1 = (abool ? 1 : 2);    //Cannot implicitly convert type 'int' to 'byte'
     Byte by2 = (aboolean ? 1 : 2); //Cannot implicitly convert type 'int' to 'byte'
     Byte by3 = (true ? 1 : 2);     //Warning: unreachable code ;)
    

    最简单的解决方法似乎就是这种类型

     Byte by1 = (Byte)(aboolean ? 1 : 2);
    

    因此,是的,三元运算符似乎导致常量将其类型“固定”为int,并禁用隐式类型转换,否则您将从适合较小类型的常量中获得隐式类型转换。

        3
  •  7
  •   Hamish Grubijan    16 年前

    private static readonly Byte valueZero = (byte)0;
    private static readonly Byte valueOne = (byte)1;
    

    只有这些变量。你可以用它来逃脱惩罚 const 如果是本地项目。

    编辑: 使用 readonly 没有意义——这些都是永远不会改变的。

    推荐文章