Не удается неявно преобразовать тип 'System.ValueType' в 'int?' - PullRequest
2 голосов
/ 23 декабря 2011

У меня есть класс-оболочка C ++ / CLI для взаимодействия между C # и собственным C ++.Я получаю странную ошибку, связанную с System.Nullable.Я понимаю, что для базовых типов System.Nullable<T> эквивалентно T?.Поэтому я делаю это:

C #:

public int? RoboticsArmRotation {
   get { return mRobotics.ArmRotation; }
}

C ++ / CLI, интерфейс:

virtual property System::Nullable<int>^ ArmRotation{ System::Nullable<int>^ get() = 0; }

C ++ / CLI, конкретный класс:

virtual property System::Nullable<int>^ ArmRotation {
    System::Nullable<int>^ get() {
        boost::optional<int> value = m_pNativeInstance->getArmRotation();
        return value.is_initialized()? gcnew System::Nullable<int>(value.get()) : gcnew System::Nullable<int>();
    }
}

Но я получаю ошибку компиляции заголовка.Приведение к int? решает это, но меня беспокоит то, что он говорит System.ValueType, когда я определил свой nullable как ссылку.Могу ли я покинуть актерский состав и продолжить или я делаю что-то не так?

1 Ответ

6 голосов
/ 23 декабря 2011

Вы используете Nullable<int>^, который является ссылкой.Поскольку ссылки с типом значения напрямую не поддерживаются средой выполнения, фактическим типом на уровне IL является ValueType, который помечен Nullable<int>^ способом, который поддерживает C ++ / CLI, но C # - нет.Для C # он просто набирается как System.ValueType.

. Это имеет даже меньше смысла для значений NULL, чем для нормальных типов значений, поскольку NULL-элементы упаковываются в качестве базового типа.поле в качестве ссылки в C ++ либо, но использовать простой Nullable<int>.

...