繁体   English   中英

VB.NET和调用byval / byref C#重载

[英]VB.NET and calling byval/byref C# overloads

我们有一个C#类,其中包括两个函数,它们的参数仅在参数修饰符上有所不同:

bool DoSomething(Object obj){};
bool DoSomething(ref Object obj){};

现在我们需要从VB.NET调用此方法(实际上是其中任何一个)。 问题在于VB.NET编译器无法决定使用哪种方法。

问题是:有没有办法告诉编译器我们想要第一个变体(或者第二个变体,对调用者来说没有关系)?

在VB.NET中将呼叫编写为DoSomething((myObj)) (即添加括号)无济于事。

您可以创建一个单独的用C#编写的库,该库为助手方法提供不同的名称,以使您能够调用模棱两可定义的DoSomething方法。 您不必这样做,并且人们可能会想知道您为什么这样做,因此您可以在其中添加严厉的评论,解释为什么这样做是必要的。

或者您可以使用反射,大致像这样:

Dim methods = GetType(WhatEverTheType).GetMethods()
Dim doSomethingMethod = methods.Single(Function(method As MethodInfo)
        Return method.Name = "DoSomething" _
        And Not method.GetParameters()(0).ParameterType.IsByRef
    End Function)
doSomethingMethod.Invoke(instanceOfWhatEverTheType)

AFAIK,唯一的方法是使用Reflection强制对API的调用。 尽管我不确定是否可以。

问题在于,创建2个仅因ref而不同的重载不符合CLS,因此不能保证在所有.NET语言中都能正常工作。 为避免发生这种情况,应将CLSCompliantAttribute添加AssemblyInfo.cs文件中,然后当CLS兼容性中断时,编译器将向您发出警告。

[assembly: System.CLSCompliant(true)]

解决此问题的一种方法是添加可以通过VB.NET调用的包装器函数。

bool DoSomething(Object obj){};
bool DoSomething(ref Object obj){};

// Call this method from VB.NET
bool DoSomething2(ref Object obj)
{
    return DoSomething(ref obj);
}

您可以通过几种不同的方法来使此清洁器更清洁,例如,如Scott Hannen所述,制作一个单独的程序集以对其进行包装,或者只是将符合CLS的wrapper方法用作扩展方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM