.net 隐式定义的变量引发运行时错误,而显式定义的变量不会引发运行时错误
使用VB.NET,我试图按照ReSharper的指导方针清理代码库。我目前拥有以下代码:.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
'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感谢您的评论。我已经编辑了我的答案。问题不是编译器找不到扩展方法,而是由于安全原因不允许使用它。