【问题标题】:Doubts about the 'var' keyword and ternary operator ?:对 'var' 关键字和三元运算符的疑问?:
【发布时间】:2011-06-22 03:36:04
【问题描述】:

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

class A {
}
class B : A {
}

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

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

object x = something ? 1 : ""

这根本不可能:)

相关问题(关于三元运算符):
Why assigning null in ternary operator fails: no implicit conversion between null and int?

【问题讨论】:

    标签: c# type-inference ternary-operator var


    【解决方案1】:

    结果是A类型,因为这两个变量都是A类型,并且其中至少一个是A类型的直接(不是通过一些转换) .

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

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

    here:

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

    condition ? first_expression : second_expression;
    

    [...]

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

    【讨论】:

    • 那么,静态类型将永远是A?任何文档解释了这些上下文中 var 关键字的行为?
    • @Oscar:是的,如果A 本身就是一个常见的类型(就像这里的情况一样)。不确定该链接,但如果我找到它会通知您。
    • @Mehrdad 有趣...感谢您的回答。
    • @Oscar:当然。如果您有兴趣,请参阅文档的更新(链接)。
    • 你的意思是'发生编译器错误',我想你忘记了 error 字。不过我不会编辑,因为我不确定。 =)
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 根本没有用的答案。我在问这是如何工作的,编译器在做什么,而不仅仅是发生了什么。当然,我可以打开 Visual Studio 并进行测试。事实上,(1) 不是
      猜你喜欢
      • 2021-04-14
      • 1970-01-01
      • 1970-01-01
      • 2011-10-24
      • 2013-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-11
      相关资源
      最近更新 更多