Как вызвать перегруженные функции С#, которые являются единственной разницей, передаваемой параметром ref или нет в С++/cli
У меня есть библиотека классов С# с перегруженными методами, а один метод имеет параметр ref, а другой - параметр значения. Я могу назвать эти методы в С#, но я не могу понять это правильно в С++/CLI. Кажется, компилятор не может отличить эти два метода.
Вот мой код С#
namespace test {
public class test {
public static void foo(int i)
{
i++;
}
public static void foo(ref int i)
{
i++;
}
}
}
и мой код С++/CLI
int main(array<System::String ^> ^args)
{
int i=0;
test::test::foo(i); //error C2668: ambiguous call to overloaded function
test::test::foo(%i); //error C3071: operator '%' can only be applied to an instance of a ref class or a value-type
int %r=i;
test::test::foo(r); //error C2668: ambiguous call to overloaded function
Console::WriteLine(i);
return 0;
}
Я знаю, что в С++ я не могу объявлять функции перегрузки, где единственная разница в сигнатуре функции заключается в том, что объект берет объект, а другой ссылается на объект, но на С# я могу.
Является ли эта функция поддерживаемой в С#, но не в С++/CLI? Есть ли способ обхода?
Ответы
Ответ 1
В качестве обходного пути вы можете создать вспомогательный класс С#, который вы используете в С++/CLI
namespace test
{
public class testHelper
{
public static void fooByVal(int i)
{
test.foo(i);
}
public static void fooByRef(ref int i)
{
test.foo(ref i);
}
}
}
Ответ 2
Я нашел что-то полезное в Wikipedia:
С++/CLI использует синтаксис " ^%", чтобы указать ссылку на отслеживание дескриптора. Понятие " * &" (ссылка на указатель) аналогично концепции Standard С++.