这个问题应该与另一个问题稍有不同。
类型推断不适用于静态变量。
Static lastAccessed = Now.AddDays(-1)
简单代码。
LastAccessed类型应为日期。
Tada它是对象。
为什么?
显然Dim lastAccessed = Now.AddDays(-1)
可以正常工作。
为什么?
注意:我很清楚我没有使用as子句。我故意不这样做,因为这就是类型推断的目的。编译器可以清楚地看到,即使没有as子句,该变量也必须是Date类型。
我也知道,这可能只是设计的决定。但是,我不知道为什么微软会做出这样的决定?显然,可以像任何局部变量一样推断静态变量
所以问题是,无论我们使用dim还是static,我们都知道编译器可以在编译时推断类型。
那么,为什么Microsoft决定不允许对静态变量进行推断?
这个问题几乎没有涉及到这个问题。问题还不清楚,提问者假设他使用dim,就使用静态变量。那里的答案仍然没有解决为什么采用这种方式的设计。 VB.NET and type inference using "Dim"
答案 0 :(得分:3)
埃里克·利珀特(Eric Lippert)在11年前的博客文章中讨论了为什么这不适用于C#编译器:https://blogs.msdn.microsoft.com/ericlippert/2009/01/26/why-no-var-on-fields/
在模块级别(从功能上来说,Static
变量)上进行类型推断的技巧要比看起来要细得多。试图在模块级别推断类型可能会引起很多麻烦(包括无法解决的循环问题)。虽然对于最简单的情况确实不是问题,但编译器开发人员需要担心这些复杂的情况。
我认为C#的推理也适用于VB。
答案 1 :(得分:1)
类型推断只能用于非静态局部变量;它不能用于确定类字段,属性或函数的类型。
和
类似地,局部类型推断不适用于声明为静态的过程级变量。
似乎是Microsoft的设计决定。 我猜想他们认为在这种典型的习惯用法中,好处是最大的,在这种习惯用法中,局部变量被初始化,并且从不重新分配。
unsigned char
(尽管有人可能会说此函数违反了依赖反转原理。)
至于静态变量,这些变量通常更倾向于“有状态”, 因此始终明确指定其类型是有意义的。显然,初始化器和后续分配共享相同的类型(例如Integer)没有问题。可以为静态变量分配同一接口的不同实现的方法有所不同。
Function DoSomething(value As Integer) As Integer
Dim foo = New Foo(value)
foo.DoProcess()
Return foo.EndResult
End Function
请注意,即使编译器允许,也无法在此处删除Function DoSomething(value As Integer) As Integer
Static foo As IFoo = New DefaultFooImplementation()
If value <> 0 Then ' else stick to the previous foo
foo = FooFactory.Create(value)
End If
foo.DoProcess()
Return foo.EndResult
End Function
。
您可能会争辩说,对于非静态局部变量也可能如此。
As IFoo
但是,老实说,重用这样的变量应该被认为是不好的做法。我可以想象微软拒绝刺激这一点。
我承认在本地变量和静态变量之间不是黑色和白色。 在任何给定情况下,仍然要由开发人员来判断类型推断是否合适。