Как вызвать перегруженные функции С#, которые являются единственной разницей, передаваемой параметром 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 С++.