在代码中做一些更改我使用下一行:

uint a = b == c ? 0 : 1;

Visual Studio向我显示了以下错误:

无法将类型"int"隐式转换为"uint".存在显式转换(是否缺少演员阵容?)

但如果我使用代码:

uint a; 

if (b == c) 
    a = 0; 
else 
    a = 1;

它工作正常,没有任何错误或警告.为什么?

推荐答案

为什么我不能用uint a = b == c ? 0 : 1;

表达式b == c ? 0 : 1的类型是int.如this table中所示,不存在从intuint的隐式转换,因此这是不允许的.

为什么我可以用a = 0

因为当值是常量表达式时,对数值类型有特殊处理.

根据C#规范第6.1.9节:

  • int类型的常量表达式可以转换为sbyte、byte、short、ushort、uint或ulong类型,前提是常量表达式的值在目标类型的范围内.

  • 如果常量表达式的值不为负值,则可以将类型为long的常量表达式转换为类型ulong.

如第一个项目符号a = 0a = 1所示,因为01是常量表达式并且是有效的uint值,所以两者都是允许的.基本上,这归结为编译器可以在编译时很容易地确定这些转换是有效的,因此它允许它们.

顺便说一句,如果第一个示例中的b == c部分被更改为常量表达式(例如true),那么整个条件运算符表达式将是常量表达式,并且代码将被编译.

.net相关问答推荐

Docker镜像mcr.microsoft.com/dotnet/aspnet:8.0不能在Windows上构建

在 .NET 7 项目上设置 Sentry 时遇到问题

通过 System.Net.Mail 的 VB SMTP 停止工作

更改列表中的值

使用 PostAsJsonAsync C# 时出现错误请求

无法使用 int.Parse 从字符串转换值

在 C# 中获取 log4net 日志(log)文件

在 .NET 反射中使用 GetProperties() 和 BindingFlags.DeclaredOnly

在 Moq 中模拟泛型方法而不指定 T

返回 IQueryable 或不返回 IQueryable

是什么让 Enum.HasFlag 这么慢?

如何明智地使用 StringBuilder?

什么决定了 Path.GetTempPath() 的返回值?

C#:获得完整的桌面大小?

如何在我的 C# 程序的面板中运行另一个应用程序?

如何禁用 Alt + F4 关闭表单?

通过反射查找可空属性的类型

使用 C# 将时间跨度值转换为格式hh:mm Am/Pm

判断任意字符串是否为有效文件名的最简单方法

如何在 ASP.NET MVC 中重定向到动态登录 URL