Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Implicitly defined variable throws run-time error while explicitly defined does not

Using VB.NET, I'm trying to clean up a code base following ReSharper's guidelines. I currently have the following code:

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

oSearchRoutines = 'WcfCallThatReturnsSearchClient

oSearchResults = oSearchRoutines.getSearchResults(oSearchInput).ToList

Now this works completely fine, but ReSharper warns that As New SearchClient has 'Value assigned is not used in any execution path'. So I removed that part to get this code:

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

oSearchRoutines = 'WcfCallThatReturnsSearchClient

oSearchResults = oSearchRoutines.getSearchResults(oSearchInput).ToList

If I'm understanding this correctly, everything should work exactly the same. However, an error is thrown when calling ToList:

Public member 'ToList' on type 'SearchResult()' not found.

I'm not exactly sure why there's any difference between the two snippets I have here.

like image 560
Mike Avatar asked Sep 09 '26 07:09

Mike


1 Answers

Because you're not assinging the type SearchClient in your second example, oSearchRoutines will automatically be of type Object.

An expression of type Object is mainly not allowed to use Extension methods, like for example the ToList-method. For further information see here

The following example illustrates this behaviour:

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

The message Value assigned is not used in any execution path, appears because you're declaring oSearchRoutines with New in your first example. This is unnecessary because you're assinging a new value to it on the line...

oSearchRoutines = 'WcfCallThatReturnsSearchClient

...before using it anywhere.

Thus you can just declare it without the keyword New

Dim oSearchRoutines As SearchClient

Related question: VB.NET: impossible to use Extension method on System.Object instance

like image 175
MatSnow Avatar answered Sep 11 '26 14:09

MatSnow



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!