首页 > 解决方案 > sbyte 和 if 运算符

问题描述

为什么在下面的示例代码中允许第一个语句而不是第二个语句?

sbyte test1 = true ? 1 : -1;             // Allowed
sbyte test2 = "a".Equals("b") ? 1 : -1;  // Not allowed

我检查了所有.Equals(..)重载是否string返回 a bool

标签: c#.net

解决方案


第一条语句包含一个可以在编译时计算的常量表达式。这相当于:

sbyte test1 = 1;

从技术上讲,这是将int文字 ( 1) 分配给sbyte变量。但是编译器足够聪明,可以确定该值足够小以适合sbyte范围并允许隐式转换,即您不需要将其强制转换为 int。

第二条语句包括一个方法调用,并且仅在运行时评估。换句话说,编译器不够聪明,无法简化表达式。它唯一知道的是这个印象返回一个未知的int值,应该明确地转换这些值。例如,像这样:

sbyte test2 = (sbyte) ("a".Equals("b") ? 1 : -1);

所有这些都在 C# 规范中进行了解释。请参阅隐式常量表达式转换

如果常量表达式的值在目标类型的范围内,则 int 类型的常量表达式(常量表达式)可以转换为 sbyte、byte、short、ushort、uint 或 ulong 类型。


推荐阅读