gpt4 book ai didi

.net - 为什么VB.Net在接口(interface)上找不到扩展方法?

转载 作者:行者123 更新时间:2023-12-04 18:48:05 26 4
gpt4 key购买 nike

我有一个具有扩展方法的 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")

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

Public member 'ExtensionMethod' on type 'SomethingB' not found.



如果将 VB.Net 更改为显式使该类型成为其工作的接口(interface):
Dim something as ISomething = Me.SomethingManager.GetSomething(key)
Dim result = something.ExtensionMethod("extra")

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

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

最佳答案

使用 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")

由于 somethingObject 类型,它找不到扩展方法,因为它没有在类型 Object 上定义.

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

最佳做法是同时设置 Option StrictOption Infer到开。

关于.net - 为什么VB.Net在接口(interface)上找不到扩展方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10829615/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com