我有以下扩展方法:
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] 删除。
我来说两句