可空类型和三元运算符:为什么是 `? 10 : null` 禁止?

发布于 2024-07-19 02:36:02 字数 461 浏览 9 评论 0原文

我刚刚遇到一个奇怪的错误:

private bool GetBoolValue()
{
    //Do some logic and return true or false
}

然后,在另一个方法中,类似这样:

int? x = GetBoolValue() ? 10 : null;

简单,如果该方法返回 true,则将 10 分配给 Nullableint x。 否则,将 null 分配给可空 int。 然而,编译器抱怨:

错误 1 ​​无法确定条件表达式的类型,因为 int 之间没有隐式转换。

我要疯了吗?

I just came across a weird error:

private bool GetBoolValue()
{
    //Do some logic and return true or false
}

Then, in another method, something like this:

int? x = GetBoolValue() ? 10 : null;

Simple, if the method returns true, assign 10 to the Nullableint x. Otherwise, assign null to the nullable int. However, the compiler complains:

Error 1 Type of conditional expression cannot be determined because there is no implicit conversion between int and <null>.

Am I going nuts?

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

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

发布评论

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

评论(9

秋叶绚丽 2024-07-26 02:36:02

编译器首先尝试计算右侧表达式:

GetBoolValue() ? 10 : null

10 是一个 int 文字(不是 int?),并且 null< /code> 是 null。 这两者之间没有隐式转换,因此会出现错误消息。

如果将右侧表达式更改为以下表达式之一,则它会编译,因为 int?null (#1) 之间以及 之间存在隐式转换intint? (#2, #3)。

GetBoolValue() ? (int?)10 : null    // #1
GetBoolValue() ? 10 : (int?)null    // #2
GetBoolValue() ? 10 : default(int?) // #3

The compiler first tries to evaluate the right-hand expression:

GetBoolValue() ? 10 : null

The 10 is an int literal (not int?) and null is, well, null. There's no implicit conversion between those two hence the error message.

If you change the right-hand expression to one of the following then it compiles because there is an implicit conversion between int? and null (#1) and between int and int? (#2, #3).

GetBoolValue() ? (int?)10 : null    // #1
GetBoolValue() ? 10 : (int?)null    // #2
GetBoolValue() ? 10 : default(int?) // #3
何止钟意 2024-07-26 02:36:02

试试这个:

int? x = GetBoolValue() ? 10 : (int?)null;

基本上发生的事情是条件运算符无法确定表达式的“返回类型”。 由于编译器隐式地确定 10int,因此它会确定该表达式的返回类型也应是 int。 由于 int 不能为 null(条件运算符的第三个操作数),因此它会抱怨。

通过将 null 转换为 Nullable,我们明确告诉编译器该表达式的返回类型应为 Nullable >。 您也可以轻松地将 10 转换为 int? 并获得相同的效果。

Try this:

int? x = GetBoolValue() ? 10 : (int?)null;

Basically what is happening is that conditional operator is unable to determine the "return type" of the expression. Since the compiler implictitly decides that 10 is an int it then decides that the return type of this expression shall be an int as well. Since an int cannot be null (the third operand of the conditional operator) it complains.

By casting the null to a Nullable<int> we are telling the compiler explicitly that the return type of this expression shall be a Nullable<int>. You could have just as easily casted the 10 to int? as well and had the same effect.

绿光 2024-07-26 02:36:02

试试这个:

int? 结果=条件? 10:默认(int?);

Try this:

int? result = condition ? 10 : default(int?);

你不是我要的菜∠ 2024-07-26 02:36:02

顺便说一句,C# 编译器的 Microsoft 实现实际上以一种非常微妙且有趣(对我来说)的方式错误地进行了条件运算符的类型分析。 我的文章是类型推断困境,第一部分 (2006-05-24)。

Incidentally, the Microsoft implementation of the C# compiler actually gets the type analysis of the conditional operator wrong in a very subtle and interesting (to me) way. My article on it is Type inference woes, part one (2006-05-24).

旧伤还要旧人安 2024-07-26 02:36:02

尝试以下其中一项:

int? x = GetBoolValue() ? (int?)10 : null;

int? x = GetBoolValue() ? 10 : (int?)null;

Try one of these:

int? x = GetBoolValue() ? (int?)10 : null;

int? x = GetBoolValue() ? 10 : (int?)null;
情徒 2024-07-26 02:36:02

问题是三元运算符根据您的第一个参数分配推断类型...在本例中为 10,它是一个 int,而不是可为 null 的 int。

您可能会有更好的运气:

int? x = GetBoolValue() (int?)10 : null;

The problem is that the ternary operator is inferring type based on your first parameter assignment...10 in this case, which is an int, not a nullable int.

You might have better luck with:

int? x = GetBoolValue() (int?)10 : null;
羁绊已千年 2024-07-26 02:36:02
int? x = GetBoolValue() ? 10 : (int?)null;

您看到此情况的原因是因为您在幕后使用 Nullable,并且您需要告诉 C# 您的“null”是 Nullable 的 null 实例。

int? x = GetBoolValue() ? 10 : (int?)null;

The reason you see this is because behind the scenes you're using Nullable and you need to tell C# that your "null" is a null instance of Nullable.

双手揣兜 2024-07-26 02:36:02

只需添加一个明确的强制转换即可。

int? x = GetBoolValue() ? 10 : (int?)null;

令人困惑的是三元运算符 - 第二个参数是一个整数,第三个参数也应该是一个整数,而 null 不适合。

Just add an explict cast.

int? x = GetBoolValue() ? 10 : (int?)null;

It is the ternary operator that gets confused - the second argument is an integer and so is the third argument exspected to be an integer, too, and null does not fit.

暗藏城府 2024-07-26 02:36:02

这是因为编译器通过第二个和第三个操作数来确定条件运算符的类型,而不是通过将结果分配给什么来确定。 编译器可以使用整数和空引用之间的直接转换来确定类型。

It's because the compiler determines the type of the conditional operator by its second and third operand, not by what you assign the result to. There is no direct cast between an integer and an null reference that the compiler can use to determine the type.

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