为什么Microsoft决定禁用类型推断在vb.net中的静态方法上不起作用?

时间:2019-12-06 11:17:35

标签: vb.net

这个问题应该与另一个问题稍有不同。

类型推断不适用于静态变量。

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"

2 个答案:

答案 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)

来自 https://docs.microsoft.com/en-us/dotnet/visual-basic/programming-guide/language-features/variables/local-type-inference (强调我的):

  

类型推断只能用于非静态局部变量;它不能用于确定类字段,属性或函数的类型。

  

类似地,局部类型推断不适用于声明为静态的过程级变量。

似乎是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

但是,老实说,重用这样的变量应该被认为是不好的做法。我可以想象微软拒绝刺激这一点。

我承认在本地变量和静态变量之间不是黑色和白色。 在任何给定情况下,仍然要由开发人员来判断类型推断是否合适。