【问题标题】:Why doesn't C# allow for global inferred types i.e. using var?为什么 C# 不允许全局推断类型,即使用 var?
【发布时间】:2010-04-08 08:58:36
【问题描述】:

我知道这是做不到的,因为使用 var 只能用于局部变量。我只是想知道是否有人知道为什么 C# 团队认为应该如此。例如这会有什么问题:

public class SomeClass
{
    var someString = "hello"; //not cool
    public SomeClass()
    {
        var someOtherString = "hello"; //cool
    }
}

如果someString 被初始化,那么它显然是一个字符串,就像someOtherString。为什么局部变量有一条规则,而全局变量有一条规则?

【问题讨论】:

  • 那是关于方法参数是 var。对我来说,这很明显,因为没有实例化方法定义如何知道参数是什么。
  • 没错,应该更清楚:这是一个不同的问题,但答案相同:成员变量的 var 是不可能的,因为编译器必须进行重大更改,并且成本/收益比是'不足以保证这种改变。

标签: c# c#-3.0 inferred-type


【解决方案1】:

重复,因此是 CW。

posting by Eric Lippert

让我快速简单地介绍一下 C# 编译器的工作原理。首先,我们遍历每个源文件并进行“仅顶级”解析。也就是说,我们在所有嵌套级别识别每个命名空间、类、结构、枚举、接口和委托类型声明。我们解析所有字段声明、方法声明等。事实上,我们解析除了方法体之外的所有内容;那些,我们跳过,稍后再回来。
[...]
如果我们有“var”字段,那么在分析表达式之前无法确定字段的类型,而这发生在我们已经需要知道字段的类型之后。

【讨论】:

  • 优秀。为清楚起见,我还将添加该文章中的以下关键引用:“字段声明有两个部分:类型声明和初始化程序。将类型与字段名称相关联的类型声明在初始顶部进行分析 -级别分析 [...] 但初始化实际上被视为构造函数的一部分”
【解决方案2】:

这与编译器必须解析类型的搜索量有关。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多