Проблема для пользовательского оператора из управляемого C++ в C#

Я оборачиваю некоторый код C++ в управляемый C++, чтобы получить к нему доступ в C#: я не могу понять, как заставить операторы правильно работать в C#

Я создаю в управляемом С++:

public ref class ClassCLI
{
public:
    double val;
    ClassCLI() {};
    void operator ++() { val++; };
    double% operator[](int i) { return val; }


};

Это работает в управляемом С++:

ClassCLI^ obj = gcnew ClassCLI();
obj++;
obj[0] = 12.0;

Но в C# я не могу использовать операторы ++ или [] напрямую, мне приходится использовать какое-то уродливое имя, которое противоречит назначению операторов.

var obj = new ClassCLI();
obj.op_Increment();
obj.op_Subscript(0) = 12.0;

Может ли кто-нибудь сказать мне, что я делаю неправильно? В некоторых сообщениях я говорю, что операторы должны быть статическими для С#, это легко для оператора ++, но не знаю, как это сделать для оператора []


person AlexP    schedule 12.05.2020    source источник
comment
Вы получаете сообщение об ошибке при использовании obj++ в C#? Какая ошибка?   -  person Sinatr    schedule 12.05.2020
comment
Да, obj++ недоступен и не компилируется. Я читал, что операторы в C# должны быть статическими. Это легко для оператора ++, но мне также нужен оператор [] (int i), и кажется невозможным сделать его статическим. Так что все еще не уверен, что это правильный путь   -  person AlexP    schedule 12.05.2020


Ответы (1)


Если вы обратитесь к

у вас может возникнуть идея реализовать свой класс ClassCLI.

Пример реализации:

C++

public ref class ClassCLI
{
public:
    double val;
    ClassCLI() {};

    property double default[int]
    {
        double get(int index) { return val; }
        void set(int index, double value) { val = value; }
    }

    static ClassCLI^ operator ++(ClassCLI^ c)
    {
        c->val++;
        return c;
    };
};

C#:

static void Main()
{
   ClassCLI c = new ClassCLI();
   Console.WriteLine(c.val);
   c++;
   Console.WriteLine(c.val);
   c[0] = 12;
   Console.WriteLine(c.val);
   Console.Read();
}

Выход:

0

1

12

person Hamid Reza Mohammadi    schedule 12.05.2020