【问题标题】:Type inference rules in C#?C# 中的类型推理规则?
【发布时间】:2020-10-28 14:41:36
【问题描述】:

我阅读了following MSDN 页面,其中陈述了以下有趣的事情:

第一条规则是 var 声明遵循普通类型 推理规则:类型被推断为静态类型 切换表达式。根据该规则,类型始终匹配。

我在 MSDN 中找不到对所谓“正常类型推断规则”的引用,为什么 var 在这个意义上使用推断开关表达式的静态类型?

也许我不知道static 类型是什么。我知道 static 关键字的作用,但我认为 switch 表达式中不会发生这种情况。

【问题讨论】:

  • 你能分享一下你的问题的小代码示例吗?
  • 静态类型只是指编译时已知的类型

标签: c# .net .net-core types switch-statement


【解决方案1】:

C# 是一种静态类型语言,这意味着在编译时必须知道类型,并且分配给变量的类型在运行时不能更改。首先考虑以下所有行的结果完全相同:

int x = 123;
System.Int32 x = 123;
var x = 123;
  • int 只是 System.Int32 的别名
  • 编译器推断在使用varx 的类型是System.Int32,因为它被分配了一个整数。

不能用 C# 做而你可以用 动态 类型语言(如 javaScript)做的是:

var x = 123;
x = "Hello world";

在 C# 中,编译器会抱怨您不能将字符串分配给 int 变量,但作为动态语言的 JavaScript 允许这样做。

【讨论】:

  • 由于 OP 询问了开关盒,如果您在模式匹配中使用它,在开关盒中添加它可能会很好,它会推断输入开关的任何类型。
【解决方案2】:

也许我不知道static 类型是什么。我知道 static 关键字的作用,但我不认为这就是 switch 表达式中发生的事情。

在您链接的示例中,通过“switch 表达式的静态类型”,它们指的是变量 shapeDescription 的类型 - 例如输入 字符串

换句话说,遵循“正常类型推断规则” - var o 也有类型 string

static object CreateShape(string shapeDescription)
{
    switch (shapeDescription)
    {
        // removed for conciness

        case var o when (o?.Trim().Length ?? 0) == 0:
            // white space
            return null;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-17
    • 2012-09-15
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    • 2016-08-07
    • 2017-09-23
    • 2013-06-06
    相关资源
    最近更新 更多