2017-12-05 32 views
1

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は、「割り当てられた値は、任意の実行パスで使用されていない」持っていることを警告しています。だから私はこのコードを取得するためにその部分を削除しました:

私はこれを正しく理解していれば、すべてがまったく同じになるはずです。ただし、ToListを呼び出すと、エラーがスローされます。

タイプ 'SearchResult()'にパブリックメンバー 'ToList'が見つかりません。

ここにある2つのスニペットには、なぜ違いがあるのか​​正確にはわかりません。

+2

'新SearchClient'は型を宣言するよりも多くがそうであるように、そのオブジェクトを作成します。後でWcfメソッドからオブジェクトを割り当てると、最初のオブジェクトは使用されず、何の理由もなく作成されました。 2番目の宣言、 'Dim oSearchRoutines'はOption Strictでコンパイルされず、System.Objectです。 'Dim oSearchRoutines As SearchClient' – Plutonix

+0

私は完全にはわかりませんが、エラーメッセージは遅延バインディングと拡張メソッドの共通点から発生していると思います。 'ToList'はLinqが提供する拡張メソッドなので、' oSearchRoutines'の型を明示的に宣言すると、コンパイラは 'ToList'の検索方法を知っていますが、' Object'型のときは、拡張メソッド。 – Craig

答えて

2

2番目の例でSearchClientタイプを指定していないため、oSearchRoutinesは自動的にタイプObjectになります。

Objectの式は、例えば、ToListのように、主にExtension methodsを使用することはできません。割り当てられたメッセージ値が任意の実行パスで使用されていない

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を宣言しているので、表示されます。詳細についてはhere

次の例では、この動作を示しているを参照してください最初の例ではNewです。 あなたはどこにでもそれを使用する前に... ...ライン上でそれに

oSearchRoutines = 'WcfCallThatReturnsSearchClient 

を新しい値をassingingしているので、これは不要です。

このように、あなただけのキーワードを指定せずにそれを宣言することができますNew

Dim oSearchRoutines As SearchClient 

関連質問:VB.NET: impossible to use Extension method on System.Object instance

+0

あなたの診断が正しいとは思わない。 VBは、 'Object'変数に遅くバインドすることができますし、実際にはここで起こっているようです。エラーは 'getSearchResults'メソッドがないことではなく、' getSearchResults'の戻り値型に 'ToList'がないというエラーではありません。 – Craig

+1

@Craigご意見ありがとうございます。私は私の答えを編集しました。問題は、コンパイラが拡張メソッドを見つけられないことではなく、セキュリティ上の理由からそのメソッドを使用することが許可されていないことです。 – MatSnow

関連する問題