在 C# 中,为什么条件运算符不能隐式转换为可为空类型

发布于 2024-07-07 05:38:07 字数 266 浏览 8 评论 0原文

我很好奇为什么隐式转换失败......

int? someValue = SomeCondition ? ResultOfSomeCalc() : null;

以及为什么我必须执行显式转换在

int? someValue = SomeCondition ? ResultofSomeCalc() : (int?)null;

我看来,编译器拥有做出隐式转换决定所需的所有信息,不是吗?

I am curious as to why an implicit cast fails in...

int? someValue = SomeCondition ? ResultOfSomeCalc() : null;

and why I have to perform an explicit cast instead

int? someValue = SomeCondition ? ResultofSomeCalc() : (int?)null;

It seems to me that the compiler has all the information it need to make an implicit casting decision, no?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

你是我的挚爱i 2024-07-14 05:38:07

C# 3.0 规范的相关部分是 7.13,条件运算符:

?: 运算符的第二个和第三个操作数控制条件表达式的类型。 设 X 和 Y 为第二个和第三个操作数的类型。 那么,

如果 X 和 Y 是相同的类型,那么这就是条件的类型
否则,如果存在从 X 到 Y 的隐式转换(第 6.1 节),但不存在从 Y 到 X 的隐式转换,则 Y 是条件表达式的类型。
否则,如果存在从 Y 到 X 的隐式转换(第 6.1 节),但不存在从 X 到 Y 的隐式转换(第 6.1 节),则 X 是条件表达式的类型。
否则,无法确定表达式类型,并且会发生编译时错误。

The relevant section of the C# 3.0 spec is 7.13, the conditional operator:

The second and third operands of the ?: operator control the type of the conditional expression. Let X and Y be the types of the second and third operands. Then,

If X and Y are the same type, then this is the type of the conditional
Otherwise, if an implicit conversion (§6.1) exists from X to Y, but not from Y to X, then Y is the type of the conditional expression.
Otherwise, if an implicit conversion (§6.1) exists from Y to X, but not from X to Y, then X is the type of the conditional expression.
Otherwise, no expression type can be determined, and a compile-time error occurs.

甜`诱少女 2024-07-14 05:38:07

我还很恼火的是它无法根据赋值推断类型,特别是当它是值类型时。 不过,当您进入对象层次结构时,这是有原因的。

如果“ResultOfSomeCalc()”返回“int?”,那么这将起作用。 无论赋值左边是什么,C# 都需要找出类型。 因此,您告诉它您将返回 null 或 int - 并且编译器中的逻辑不存在让它替换 Nullable 作为公分母。

请注意,这些变体确实有效,并且可能会帮助您理解:

object someValue = true ? new Nullable<int>(ResultOfSomeCalc()) : null;

object someValue = true ? (int?)ResultOfSomeCalc() : null;

希望这会有所帮助。

I also am annoyed that it can't infer the type based on the assignment, especially when it's a value type. There are reasons though when you get into object heirarchies.

If "ResultOfSomeCalc()" returned a "int?", then this would work. C# needs to figure out the type regardless of what is to the left of the assignment. So you are telling it that you'll return a null or an int - and the logic in the compiler doesn't exist to have it substitute a Nullable as a common denominator.

Notice that these variants DO work, and it may help you understand:

object someValue = true ? new Nullable<int>(ResultOfSomeCalc()) : null;

object someValue = true ? (int?)ResultOfSomeCalc() : null;

Hope this helps.

許願樹丅啲祈禱 2024-07-14 05:38:07

看起来编译器应该能够自己解决这个问题,但还有另一种方法可以做到这一点,即使用 default 关键字。 它可能比强制转换稍微难看一点:

int? someValue = SomeCondition ? ResultofSomeCalc() : default(int?);

默认值的使用似乎没有很好的记录,但确实有效。 至少它可以让你不必在代码中乱扔魔法值(我认为 null/零/false/等等确实是魔法值)。

It sure seems like this is something the compiler should be able to figure out for itself, but there is one other way to do this, using the default keyword. It might be the tiniest bit less ugly than the cast:

int? someValue = SomeCondition ? ResultofSomeCalc() : default(int?);

This use of default doesn't seem to be well documented, but is does work. At least it keeps you from having to litter your code with magic values (I contend that null/zero/false/etc. are indeed magic values).

旧夏天 2024-07-14 05:38:07

如果您的函数 ResultofSomeCalc() 返回 int? 那么这就会起作用。

如果你的函数返回 int,那么编译器会发出警告:
无法确定条件表达式的类型,因为 'int' 和 '' 之间没有隐式转换
我猜这就是你所看到的。 条件运算符“?:”中的两个表达式必须具有相同的类型,或者必须可通过隐式强制转换转换为相同的类型。

将 ResultOfSomeCalc 的返回类型更改为 int?,否则您将需要对 null 表达式进行强制转换。

If your function ResultofSomeCalc() returns int? then this will work.

If your function returns int, then the compiler issues the warning:
Type of conditional expression cannot be determined because there is no implicit conversion between 'int' and ''
I'm guessing that is what you are seeing. Both expressions in the conditional operator "?:" must have the same type, or must be convertible to the same type via an implicit cast.

Change the return type of ResultOfSomeCalc to int?, or you will need to have the cast on the null expression.

小矜持 2024-07-14 05:38:07

将函数 ResultOfSomeCalc() 的返回类型设置为 nulllabel int,如 (int?)
整数? someValue =(int?) SomeCondition ? ResultofSomeCalc() : (int?)null;

Make your function ResultOfSomeCalc()'s return type as nullabel int like (int?)
int? someValue =(int?) SomeCondition ? ResultofSomeCalc() : (int?)null;

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文