C# dll中的扩展方法在VB.NET中无法作为扩展方法使用。

4

实际上我不知道它们是否应该工作。

我用C#制作了一个库,有人告诉我我的其中一种方法在VB.NET中作为扩展无法使用。 http://valueinjecter.codeplex.com/Thread/View.aspx?ThreadId=227498

这是这个方法:

public static PropertyDescriptorCollection GetProps(this object o)
{
   return GetProps(o.GetType());
}
1个回答

5
通常情况下,C#扩展方法在VB.Net中也能正常工作,反之亦然。唯一的例外是当“this”参数显式地类型化为Object时。由于历史原因,VB.Net不支持对引用类型为Object的扩展方法的使用。
这样做的原因是有潜在可能导致代码以不同的语义默默地重新编译。VB.Net(和C#)认为导入包含扩展方法的命名空间不应该将现有代码默默重新绑定到扩展方法。如果VB.Net允许在Object上使用扩展方法,则可以使后期绑定调用默默地重新绑定到扩展方法,从而改变代码。
例如,在您的扩展方法编写之前,请考虑以下内容。
Dim local As Object = ... 
local.GetProps() ' This is a late bound call

如果VB.Net允许在“Object”上定义“GetProps”扩展方法,那么只需导入您的命名空间即可将“GetProps”的含义从后期绑定更改为扩展方法调用。

VB.Net运行时绑定器是否可以在指定方法不是对象类的一部分时考虑扩展方法呢?或者说扩展方法在运行时不可用吗? - Gabe
@Gabe,运行时绑定器是否可以考虑扩展方法...是的。这将需要进行几个更改(包括将所有导入的命名空间作为后期绑定调用的一部分传递)。但它可以被制作成可用。问题在于它会创建不可预测的行为,因为用于后期绑定的考虑方法集将受到在进程中加载的DLL/EXE的影响而发生变化。这意味着DLL加载顺序的简单更改可能会改变对GetProps的解释。这是一个非常可怕的前景。 - JaredPar
在这种情况下,编译器可以将GetProps解析为扩展方法,并仅将其传递给运行时绑定器作为回退。虽然在运行时动态解析扩展方法可能很好(或者很可怕),但似乎并不需要获得OP所期望的行为。 - Gabe
显而易见的是,OP仍然可以调用PropertyDescriptorCollection.GetProps(x) - H H
@Gabe,一个产生不可预测行为的功能是不好的。 - JaredPar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接