簡體   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