c# - sbyte 和 if 运算符
问题描述
为什么在下面的示例代码中允许第一个语句而不是第二个语句?
sbyte test1 = true ? 1 : -1; // Allowed
sbyte test2 = "a".Equals("b") ? 1 : -1; // Not allowed
我检查了所有.Equals(..)
重载是否string
返回 a bool
。
解决方案
第一条语句包含一个可以在编译时计算的常量表达式。这相当于:
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 类型。
推荐阅读
- c# - JSON.NET 将 JSON 反序列化为具有自定义规则的对象
- r - 无法在远程服务器上使用 RestRserve 开发 API
- .net-core - Application Insights SDK - 仅收集特定的依赖项?
- javascript - 如何将相同的组件用于相似但不同的目的?
- javascript - 使用 npm,如何更新核心依赖项?
- azure-devops-migration-tools - 如何最好地迁移个人查询?
- c# - Blazor PWA 无法调用 .net 框架 dll
- c# - 如何从 C# 访问基于 url 的共享点目录?
- python - 如何在 Python 中对文件名进行排序
- jquery - 使用基于类名和 id 的 jquery 添加类