隐式定义的变量会抛出运行时错误,而显式定义则不会

时间:2017-12-05 15:21:36

标签: .net vb.net winforms resharper

使用VB.NET,我正在尝试按照ReSharper的指导方针清理代码库。我目前有以下代码:

'oSearchInput is defined outside this question
Dim oSearchRoutines As New SearchClient
Dim oSearchResults As List(Of SearchResult)

oSearchRoutines = 'WcfCallThatReturnsSearchClient

oSearchResults = oSearchRoutines.getSearchResults(oSearchInput).ToList

现在这完全正常,但ReSharper警告As New SearchClient已经'分配的值未在任何执行路径中使用'。所以我删除了那部分以获取此代码:

'oSearchInput is defined outside this question
Dim oSearchRoutines
Dim oSearchResults As List(Of SearchResult)

oSearchRoutines = 'WcfCallThatReturnsSearchClient

oSearchResults = oSearchRoutines.getSearchResults(oSearchInput).ToList

如果我理解正确,那么一切都应该完全相同。但是,调用ToList时会抛出错误:

  

未找到类型'SearchResult()'的公共成员'ToList'。

我不确定为什么我这里的两个片段之间有任何区别。

1 个答案:

答案 0 :(得分:3)

由于您未在第二个示例中指定类型SearchClientoSearchRoutines将自动为Object类型。

类型Object的表达式主要不允许使用Extension methods,例如ToList - 方法。有关详细信息,请参阅here

以下示例说明了此行为:

Dim x As Object
Dim y As String = "ABC"
x = y

Dim a As List(Of Char) = y.ToList() 'This will work
Dim b As List(Of Char) = x.ToList() 'This will throw a System.MissingMemberException

消息 分配的值未在任何执行路径中使用 ,因为您在第一个示例中使用oSearchRoutines声明New而显示。 这是不必要的,因为你在线上为它赋予一个新值...

oSearchRoutines = 'WcfCallThatReturnsSearchClient

......在任何地方使用它之前。

因此,您可以在没有关键字New

的情况下声明它
Dim oSearchRoutines As SearchClient

相关问题:VB.NET: impossible to use Extension method on System.Object instance