【问题标题】:Why doesn't VB.Net type inference work in class fields?为什么 VB.Net 类型推断在类字段中不起作用?
【发布时间】:2013-05-29 19:32:43
【问题描述】:

如果我在方法体中输入以下内容:

Dim myInt = 1

Visual Studio IDE(因此,我猜是编译器)推断 myInt 的类型为 Integer

编辑

显然在这里使用文字是一个糟糕的选择,因为我卷入了与问题无关的冗长辩论。如果您对表达式 1 可能被解释为不同数字类型的实例这一事实提出异议,请假装我写过:

Dim myInstance = New MyClass()

结束编辑

但是,当我将具有完全相同代码的字段声明放在 的顶部时,不会推断出 myList 的类型:

Public Class Foo
    Dim myInt = 1
End Class

鼠标悬停时,它提到缺少 As 子句,并表示已假定一种 Object 类型。我不能将 myInt 作为参数传递给需要 Integer 参数的函数或子函数,除非显式添加 As 子句或强制转换为 Integer。

IDE 和编译器处理类型推断的方式是否存在差异?另一方面,如果编译器在这种情况下也无法推断类型,为什么方法变量和类字段之间存在差异?

【问题讨论】:

  • 正确的问题是为什么编译器允许你写这样的一行! :-) 恕我直言,您应该使用 Option Strict On 运行并标准化显式类型声明。
  • 我的猜测是在类级别声明的变量可以是任何东西(通用对象、集合、函数指针、原始类型等),因此它做出了最广泛的假设(对象)。但是在一种方法中,选项减少了,因此可以缩小类型。但正如 Marcello 所说,最好尽可能使用强类型。
  • @MarcelloRomani 我不确定这有什么不安全的地方,尤其是当所有必要的类型信息都存在时。如果我将分配给myInt 的值的类型显式强制为整数,即Dim myInt = 1I,则结果不会改变。
  • 让我问你一个问题:如果将 ASCII 符号 1 解释为数字,它是代表 Float、Double 还是 Int ?
  • @MarcelloRomani 让我问你这个问题:2 个字符的表达式 1I 可以代表多个不同的类型吗?

标签: vb.net visual-studio variables field type-inference


【解决方案1】:

你发现的东西是故意的。这是MSDN 的解释。

本地类型推断适用于过程级别。它不能用于 在模块级别声明变量(在类、结构、模块中, 或接口,但不在过程或块内)。如果 num2 在 前面的示例是类的字段而不是局部变量 在过程中,声明将导致 Option 错误 Strict on,并将 num2 分类为具有 Option Strict 的对象 离开。同样,本地类型推断不适用于过程级别 声明为静态的变量。

【讨论】:

  • 感谢您挖掘它。它仍然没有回答“为什么”,但我会接受这个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-03
  • 2015-09-11
  • 2023-03-05
相关资源
最近更新 更多