Оператор явного приведения в Managed C ++ для .NET DLL

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

У меня проблемы с реализацией оператора явного приведения к System :: String. Приведение работает в управляемой тестовой программе 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

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


person Philippe Baur    schedule 10.12.2010    source источник


Ответы (1)


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

    static explicit operator System::String^(Field^ obj)
    {      
        // etc..
    }
person Hans Passant    schedule 10.12.2010
comment
@Saeed - нет, это C ++ / CLI, язык, который использует OP. - person Hans Passant; 10.12.2010
comment
Но вы пишете C# requires ..., поэтому замените c # на .net, если это так. - person Saeed Amiri; 10.12.2010