为什么不能使用显式泛型参数调用泛型扩展方法?

随机用户

我有以下扩展方法:

Module MyModule

    <Extension()>
    Public Function MyExtension(Of T)(value As T, i As T) As Short
        Return Nothing 'omitted'
    End Function

End Module

我可以用多种方式来称呼它:

Dim fake As IFoo
fake.Bar().MyExtension(1)
MyModule.MyExtension(Of Integer)(fake.Bar(), 1)

但是用一个显式的泛型类型参数将其称为扩展方法似乎是不可能的:

fake.Bar().MyExtension(Of Integer)(1)

有没有办法在VB中做到这一点?我可以使用以下语法在C#中轻松完成此操作:

IFoo fake = null;
fake.Bar().MyExtension<int>(1);
锡锰

扩展方法(C#编程指南)中(添加了重点):

扩展方法使您可以将方法“添加”到现有类型,而无需创建新的派生类型,重新编译或修改原始类型。扩展方法是一种特殊的静态方法,但它们的调用就像是扩展类型上的实例方法一样对于用C#,F#和Visual Basic编写的客户端代码,在调用扩展方法和在类型中实际定义的方法之间没有明显的区别。

C#和VB之间的区别是上面突出显示文本的解释。

对于具有以下签名的C#扩展方法:

public static short MyExtension<T>(this T value, T i)
{
    return default(short);
}

public static short MyExtension2<T1, T2>(this T1 value, T2 i)
{
    return default(short);
}

有相应的用法作为扩展方法看起来像(忽略可以推断的类型):

SomeType v0 = null;
SomeType v1 = null;
v1.MyExtension<SomeType>(v0);
v1.MyExtension2<SomeType, int>(2);

C#只允许将静态方法当作实例方法来调用,而无需考虑“好像它们是扩展类型上的实例方法”部分。VB采取了更深入的转换方法,使签名看起来确实确实是一种实例方法。

相应的实例方法签名如下所示:

internal class SomeType
{
    public short MyExtensionInstance(SomeType i)
    {
        return default(short);
    }

    public short MyExtension2Instance<T2>(T2 i)
    {
        return default(short);
    }

}

调用实例方法如下所示:

SomeType v0 = new SomeType();
SomeType v1 = new SomeType();
v1.MyExtensionInstance(v0);
v1.MyExtension2Instance<int>(2);

这正是VB为扩展方法强制执行的语法,就像它们是扩展类型上的实例方法一样

现在回答您的问题;就这种根本的实现差异而言,没有办法强迫VB像C#一样行动。

实际上,我不明白为什么您会喜欢C#样式。指定扩展类型是冗长且多余的。我发现它还引入了与扩展方法的不一致之处,这种扩展方式中的this参数不是通用的,这是通过在不需要和有益的情况下引入鸡蛋-鸡蛋-鸡蛋(类型-方法-类型)模式引起的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么我不能显式地将类型参数传递给泛型Java方法?

为什么我需要显式转换泛型调用?

为什么泛型不能用代码编写的动作需要显式的参数声明

为什么调用使用 Span<T> 和 T[] 的泛型方法不能推断类型参数?

为什么我不能使用Type变量作为泛型类的Type参数

为什么将显式类型参数赋予非泛型方法或构造函数?

为什么ReadOnlySpan不能用作泛型委托和泛型方法的类型参数?

Java泛型-构造函数调用的显式类型参数

为什么带有泛型返回的此方法不能正确使用泛型类型?

为什么泛型类型不能具有显式布局?

Kotlin-为什么我们必须为泛型方法显式地指定类型参数?

Java-泛型类的显式方法调用?

用于在方法调用中显式指定泛型参数的Java语法

为什么我们不能扩展泛型?

为什么不能使用“ new”运算符创建泛型类型的实例?

为什么不能从与委托方法相同的泛型定义的参数中推断出泛型?

为什么我不能从泛型参数访问属性?

为什么不能使用显式模板参数调用模板朋友功能?

泛型-调用带有泛型参数的方法

为什么 Java 泛型不能用于静态方法?

为什么我不能从我用泛型创建的类中调用方法?爪哇

为什么不能将“ as”与约束为接口的泛型类型参数一起使用?

为什么不能对两个泛型类型参数使用协方差?

如果我们只能使用原始类型,为什么在Java中使用泛型时需要扩展?

为什么此方法调用失败?(泛型和通配符)

无法对方法参数进行泛型转换,为什么?

使用反射调用具有泛型类型参数的泛型方法

为什么不能使用Swift的字符串构造函数将泛型转换为字符串?

为什么不能将从另一个泛型类扩展的类作为泛型类传递?