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在没有显式接口的情况下工作吗?
使用选项推断关闭,此代码...
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 Strict并Option Infer为开。