为什么VB.Net不能在接口上找到扩展方法?

Kei*_*ith 5 .net vb.net extension-methods

我有一个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) 
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

如果从C#调用,扩展可以正常工作,但是如果从外部VB.Net应用程序调用则会出现问题:

Dim something = Me.SomethingManager.GetSomething(key)
Dim result = something.ExtensionMethod("extra")
Run Code Online (Sandbox Code Playgroud)

这编译很好但在运行时抛出异常:

未找到类型'SomethingB'上的公共成员'ExtensionMethod'.

如果将VB.Net更改为显式使类型为其工作的接口:

Dim something as ISomething = Me.SomethingManager.GetSomething(key)
Dim result = something.ExtensionMethod("extra")
Run Code Online (Sandbox Code Playgroud)

为什么?为什么扩展方法适用于接口而不是实现它的类?如果我使用子类,我会遇到同样的问题吗?VB.Net的扩展方法的实现是否不完整?

我可以在C#库中做些什么来使VB.Net在没有显式接口的情况下工作吗?

Met*_*ght 5

使用选项推断关闭,此代码...

Dim something = Me.SomethingManager.GetSomething(key)
Dim result = something.ExtensionMethod("extra")
Run Code Online (Sandbox Code Playgroud)

...是相同的...

Dim something As Object = Me.SomethingManager.GetSomething(key)
Dim result As Object = something.ExtensionMethod("extra")
Run Code Online (Sandbox Code Playgroud)

由于something是 type Object,它找不到扩展方法,因为它没有在 type 上定义Object

现在,如果您设置Option Infer On,您将获得与使用 C#var关键字相同的结果。类型将被自动推断。请注意,这也可能会破坏现有代码,但可以为特定文件启用它,例如Option Strict.

最好的做法是同时设置Option StrictOption Infer为开。