5

次のような拡張メソッドを持つ C# ライブラリがあります。

public interface ISomething { ... }
public class SomethingA : ISomething { ... }
public class SomethingB : ISomething { ... }

public static class SomethingExtensions 
{
    public static int ExtensionMethod(this ISomething input, string extra) 
    {
    }
}

拡張機能は、C# から呼び出された場合は正常に動作しますが、外部の VB.Net アプリケーションから呼び出された場合は問題があります。

Dim something = Me.SomethingManager.GetSomething(key)
Dim result = something.ExtensionMethod("extra")

これは正常にコンパイルされますが、実行時に例外がスローされます。

タイプ 'SomethingB' のパブリック メンバー 'ExtensionMethod' が見つかりません。

VB.Net を変更して明示的に型をインターフェイスにする場合は、次のように動作します。

Dim something as ISomething = Me.SomethingManager.GetSomething(key)
Dim result = something.ExtensionMethod("extra")

なんで?拡張メソッドがインターフェイスでは機能するのに、それを実装するクラスでは機能しないのはなぜですか? サブクラスを使用した場合、同じ問題が発生しますか? VB.Net の拡張メソッドの実装は不完全ですか?

明示的なインターフェイスなしで VB.Net を機能させるために、C# ライブラリでできることはありますか?

4

4 に答える 4

5

Option Infer Off を使用すると、このコードは...

Dim something = Me.SomethingManager.GetSomething(key)
Dim result = something.ExtensionMethod("extra")

...と同じです...

Dim something As Object = Me.SomethingManager.GetSomething(key)
Dim result As Object = something.ExtensionMethod("extra")

somethingは typeであるため、 typeObjectで定義されていないため、拡張メソッドを見つけることができませんObject

ここで を設定すると、C# のキーワードOption Infer Onと同じ結果が得られます。var型は自動的に推測されます。これにより既存のコードが壊れる可能性もありますが、Option Strict.

ベスト プラクティスは、 と の両方をオンに設定することOption StrictですOption Infer

于 2012-05-31T13:11:19.370 に答える
1

コンパイル時にエラーが発生するのではなく例外がスローされる場合は、 Option Strictがオフになっていることを示しています...その場合、拡張メソッドは通常コンパイル時に解決されるため、どうなるかわかりません。ただし、Option Strictをオフにすると、実行遅延が発生します。

Option Strictをオンにすることをお勧めします、そしてすべてがうまくいくはずです...

( Richardの回答に従って、名前空間インポートする必要がありますが、すでにそれを行っていると思います。とにかく、option strictをオンにした後でそれを忘れると、コンパイル時エラーが表示されます。 。)

于 2012-05-31T08:06:30.650 に答える
0

名前空間を定義するクラスを含む名前空間をインポートしましたか。

例えば。LINQ to Objects拡張メソッドは、

Imports System.Linq
于 2012-05-31T08:06:22.743 に答える