Явный оператор приведения в Managed C ++ для .NET DLL - PullRequest
0 голосов
/ 10 декабря 2010

Я пишу DLL-оболочку в Managed C ++ (/ clr) для собственной библиотеки DLL с Visual Studio 2008. Эта DLL-оболочка будет использоваться для языков программирования .NET, таких как C #.

У меня естьпроблемы с моей реализацией явного оператора приведения к System :: String.Приведение работает в тестовой программе Managed C ++, но не в тестовой программе C #.

Это ошибка, которую я получаю в программе C #:

error CS0030: Cannot convert type 'Field' to 'string'

Вот упрощенная версия того, как ясделали это:

public ref class Field
{
private:
    FieldNative* nativeObj;

public:
    Field()
    {
        nativeObj = new FieldNative();
    }

    ~Field()
    {        
        delete nativeObj; 
    }

    explicit operator System::String^(void)
    {      
        const char* value = (const char*) *nativeObj;
        return gcnew System::String(value, 0, nativeObj->size());
    }
};

Собственный объект реализует приведение к const char *, так что это работает.Я даже могу использовать его в другой управляемой программе на C ++.Однако это не работает в C #.

Вот как свойство отображается в обозревателе объектов VS2008:

Field.explicit operator string ()

public explicit operator  string()
Member of Field

Как мне реализовать явный оператор приведения в Managed C ++, чтобыэто можно использовать в C # или любом другом языке .NET?

1 Ответ

2 голосов
/ 10 декабря 2010

C # требует, чтобы операторы были статическими.Напишите так, чтобы это работало:

    static explicit operator System::String^(Field^ obj)
    {      
        // etc..
    }
...