对“var”的质疑关键字和三元运算符 ?:

发布于 2024-11-16 16:54:06 字数 539 浏览 3 评论 0原文

如果 var 关键字在编译时解析,下面的代码如何工作?

class A {
}
class B : A {
}

int k = 1;
var x = (k < 0) ? new B() : new A();

编辑:
我终于明白问题不在于 var 本身,而在于 ?: 运算符的行为。出于某种原因,我认为以下情况是可能的:

object x = some ? 1 : ""

这根本不可能:)

相关问题(关于三元运算符):
为什么在三元运算符中分配 null失败:null 和 int 之间没有隐式转换?

If var keyword is resolved at compile time, how does the following work?

class A {
}
class B : A {
}

int k = 1;
var x = (k < 0) ? new B() : new A();

Edit:
I finally understood that the problem is not about the var itself, but about the behaviour of the ?: operator. For some reason, I thought that the following could be possible:

object x = something ? 1 : ""

and that's not possible at all :)

Related question (about ternary operator):
Why assigning null in ternary operator fails: no implicit conversion between null and int?

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

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

发布评论

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

评论(3

梦屿孤独相伴 2024-11-23 16:54:06

结果是 A 类型,因为两个变量都是 A 类型,并且至少其中一个直接类型>A(不通过某种转换)。

编译器会检查三元表达式的两个部分,如果其中一个是另一个的子类型,则整个表达式将成为更通用的超类型。

但是,如果两者都不是直接的常见类型,则会发生编译器错误,可能是因为它不知道要为您向上转换多少(并且感觉不想找出)。

请参阅此处

条件运算符 (?:) 根据布尔表达式的值返回两个值之一。以下是条件运算符的语法。

<前><代码>条件?第一个表达式:第二个表达式;

[...]

first_expression 和 secondary_expression 的类型必须相同,或者必须存在从一种类型到另一种类型的隐式转换。

The result is of type A, because both of the variables are of type A, and at least one of them is directly of type A (not through some conversion).

The compiler takes a look at both parts of the ternary expression, and if one of them is a subtype of the other, the entire expression becomes the more general supertype.

However, if neither is directly of the common type, then a compiler error occurs, probably because it doesn't know how much to upcast for you (and it doesn't feel like finding out).

See here:

The conditional operator (?:) returns one of two values depending on the value of a Boolean expression. Following is the syntax for the conditional operator.

condition ? first_expression : second_expression;

[...]

Either the type of first_expression and second_expression must be the same, or an implicit conversion must exist from one type to the other.

溺渁∝ 2024-11-23 16:54:06

结果是A。确认它的一个简单方法是将鼠标放在 var 上。

The result is A. An easy way to confirm it is to place your mouse over the var.

权谋诡计 2024-11-23 16:54:06

我还没有测试过这种退化的情况。但我敢打赌要么(1)编译器抱怨要么(2)'x'是'A'类型。

I haven't tested this degenerate case. But I would bet either (1) compiler complains or (2) 'x' is of type 'A'.

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