【发布时间】: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