Jon*_*eet 13

第一个只是推断出类型是Y.第二个指定它.这允许你写下这样的东西:

Dim X as IList(Of String) = New List(Of String)
Run Code Online (Sandbox Code Playgroud)

然后限制了使用选择的范围List(Of String)- 这意味着稍后您可能会选择使用不同的实现IList(Of String),并且它仍然会编译.

当然,较短的版本确实具有简洁的好处 - 如果您有很长的类型名称(例如使用嵌套泛型),这可能很重要.它也是匿名类型所必需的,你无法表达X的类型.


Nol*_*rin 8

Jon Skeet已经提供了正确的答案,但我想我会增加一些额外的...

虽然这不是你的具体问题,但是它们之间存在着重要的区别

Dim X = New Y()
Run Code Online (Sandbox Code Playgroud)

Dim X As Y = New Y()
Run Code Online (Sandbox Code Playgroud)

这里的差异实际上取决于您使用的VB.NET版本.


VB.NET 7和8

Dim X = New Y()
Run Code Online (Sandbox Code Playgroud)

这定义X为type object(System.Object)的变量,然后创建一个类型的对象Y并将其赋值给X.请注意,这在您定义时才有效Option Strict Off,否则甚至无法编译.它实际上只是VB6及更早版本语法的结转,而且通常是气馁的.

Dim X as Y = New Y()
Run Code Online (Sandbox Code Playgroud)

这完全相同,除了X现在是强类型的,换句话说它是类型Y而不是object(所有类型都从中继承,包括盒装时的值类型).

VB.NET 9及其后的版本

Dim X = New Y()
Run Code Online (Sandbox Code Playgroud)

这里的差异(对于较新版本的VB.NET)是类型推断在这里生效.因为你没有指定任何类型,但是对于New Y()返回类型实例的编译器来说很明显Y,它会自动推断出X应该是的类型,它Y比对象更具体.类型干扰也适用于更复杂的表达式.

Dim X as Y = New Y()
Run Code Online (Sandbox Code Playgroud)

这与在VB.NET 7和8中完全相同.


总之,您可以有效地替换

Dim X As New Y()
Run Code Online (Sandbox Code Playgroud)

Dim X = New Y()
Run Code Online (Sandbox Code Playgroud)

在VB.NET 9中,由于类型推断,编译器会将这两行完全相同地解释.但是,在早期版本中,第二行将是弱类型(类型object),这是不可取的.同样,这不是问题的直接答案,但我认为这可能有助于指出.