.net 隐式定义的变量引发运行时错误,而显式定义的变量不会引发运行时错误

.net 隐式定义的变量引发运行时错误,而显式定义的变量不会引发运行时错误,.net,vb.net,winforms,resharper,.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 = oSear

使用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警告说,
因为新的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”


我不太清楚我这里的两个代码片段之间为什么有任何区别。

因为在第二个示例中,您没有分配类型
SearchClient
oSearchRoutines
将自动为类型
Object

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

以下示例说明了此行为:

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

在第一个示例中,由于您正在使用
New
声明
osearchroutlines
,因此不会在任何执行路径中使用分配的值消息。 这是不必要的,因为您正在为其分配一个新值

oSearchRoutines = 'WcfCallThatReturnsSearchClient
…在任何地方使用之前

因此,您可以不使用关键字
New

Dim oSearchRoutines As SearchClient

相关问题:

由于新的SearchClient
不仅仅声明类型,它还创建了对象。如果以后从Wcf方法指定对象,则第一个对象未被使用,并且是无缘无故创建的。第二个声明,
Dim osearchroutlines
将不会在选项Strict下编译,而只是System.Object。您可以声明一个类型而不创建它:
Dim osearchcroutines As SearchClient
我不完全确定,但我认为错误消息是由后期绑定和扩展方法的交叉引起的
ToList
是Linq提供的一种扩展方法,因此当您显式声明
oSearchRoutines
的类型时,编译器知道如何查找
ToList
,但当它是
Object
类型时,运行时解析无法找到扩展方法。我认为您的诊断并不完全正确。VB可以并且确实对
对象
变量进行后期绑定,事实上,这似乎正在这里发生。错误不在于没有
getSearchResults
方法,而在于
getSearchResults
返回类型上没有
ToList
。@Craig感谢您的评论。我已经编辑了我的答案。问题不是编译器找不到扩展方法,而是由于安全原因不允许使用它。