【问题标题】:extension methods from C# dll doesn't work as extensions in VB.NETC# dll 中的扩展方法不能作为 VB.NET 中的扩展
【发布时间】:2010-09-17 06:31:01
【问题描述】:

其实我不知道他们是否应该工作

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

这是方法:

public static PropertyDescriptorCollection GetProps(this object o)
{
   return GetProps(o.GetType());
}

【问题讨论】:

    标签: c# .net vb.net extension-methods


    【解决方案1】:

    通常 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 运行时绑定器是否可以考虑扩展方法......是的。这将需要一些更改(包括将所有导入的命名空间作为后期绑定调用的一部分传递)。但它可以工作。但问题是它会产生不可预知的行为,因为后期绑定的考虑方法集​​将被进程中加载​​的 DLL/EXE 更改。这意味着 DLL 加载顺序的简单更改可能会更改 GetProps 的解释方式。这是一个非常可怕的前景
    • 在这种情况下,编译器可以将GetProps 解析为扩展方法,并仅将其传递给运行时绑定器以用作后备。虽然在运行时动态解析扩展方法可能很好(和/或可怕),但似乎没有必要获得 OP 所期望的行为。
    • 显而易见,OP 仍然可以调用PropertyDescriptorCollection.GetProps(x)
    • @Gabe,一个会产生不可预知行为的功能很糟糕。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-01
    • 2012-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多