我有一个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对扩展方法的实现是否不完整?
在C#库中是否有任何操作可以使VB.Net在没有显式接口的情况下工作?
Option Infer On
一贯比Option Strict
更少地引起转换痛苦来解决这个问题。 - KeithOption Strict On
绝对是最佳实践。而对于 VB.Net 的开发人员,Option Infer On
能够在不需要更改大量代码的情况下解决问题。 - Keith