C # — C # 6 / C ++ ref ключевое слово ошибка

Я пробовал VS2015 с помощью своего существующего решения, и я получаю несколько новых допустимых ошибок (например, недоступный код, который компилятор не перехватывал раньше), но я также получаю ошибку, например, в этой строке:

bool bWasAlreadyLocked = false;
oEnv.LockDoc(oWarnings, oEventDoc, ref bWasAlreadyLocked);

Я получаю следующую ошибку:

Ошибка CS1503 Аргумент 3: невозможно преобразовать из ‘ref bool [mscorlib,
Версия = 4.0.0.0, Культура = нейтральная, PublicKeyToken = b77a5c561934e089] ‘до
‘ref bool [mscorlib, версия = 4.0.0.0, культура = нейтральная,
PublicKeyToken = b77a5c561934e089]

Я не могу понять, почему это вызвало бы такую ​​ошибку, очевидно, типы совпадают. Это ошибка в новом компиляторе или имеет поведение ref ключевое слово изменилось?

Функция в этом случае является функцией C ++, которая импортируется в C # с использованием класса c #, производного от класса c ++. Это подпись такова:

void CBkgDocEnvX::LockDoc(
CFIWarningList ^oWarnings,
CBaseDoc ^oBaseDoc,
// Output
bool %rbWasAlreadyLocked)

Возможно, стоит упомянуть, что я решил использовать компилятор VS2013 c ++ для исходных текстов c ++ в решении, поэтому сторона c ++ должен быть таким же, как и раньше. Я предполагаю, что что-то во взаимодействии между c # и c ++ изменилось.

16

Решение

Вы должны проверить этот пункт просто чтобы быть уверенным.

  1. Только L-значения могут быть переданы по ссылке. L-значение — это переменные и другие выражения, которые могут появляться в левой части присваивания. К ним относятся локальные, доступ к полям, разыменование указателей и доступ к элементам массива. L-значения не включают в себя доступ к свойствам, которые не имеют идентифицируемого машинного адреса, а также не включают в себя поля только для чтения, которые ограничены CLR.
  2. Параметры Ref не могут быть целью метода расширения. Вызовы методов расширения являются дорогостоящими для типов значений, поскольку параметр «this» копируется по значению. Это также означает, что типы значений не могут иметь изменяемые методы расширения. Это прямо противоположно методам экземпляра, которые передают значение типа «this» параметру по ссылке.
  3. Параметры Ref не могут использоваться в функциях перегрузки операторов.

Вы можете найти больше информации Вот.

1

Другие решения

Я получаю такие ошибки компилятора, когда два проекта имеют несовместимые типы. Часто Visual Studio позволяет мне добавлять ссылку на проект Portable Class Library (или проект .NET 4.0), даже если ссылка на сборку не поддерживается типом профиля .NET ссылочного проекта.

Самым распространенным явлением для меня является использование проекта .NET 4.0 и попытка сослаться на проект библиотеки вероятных классов, в котором в настройках профиля указан .NET 4.5, а не более старая версия .NET 4. Когда я ссылаюсь на сборку PCL из моего проекта .NET 4.0, я продолжаю получать полную поддержку intellisense (например, при редактировании исходного кода intellisense отображает все пространства имен, классы и свойства, содержащиеся в ссылочной сборке), но во время компиляции я получаю та же самая ошибка, которую вы получаете; более конкретно, когда я компилирую решение, компиляция указывает на несоответствие библиотеки, но перечисляет точно такую ​​же библиотеку, версию и открытый ключ, которые, по ее словам, она ищет.

Проверьте свойства проекта, убедитесь, что они совместимы.

1

Оказывается, эту ошибку можно исправить, явно добавив в параметр атрибут out.

Добавление [Out] к ref Параметр, очевидно, помогает новому компилятору C # распознать, что это одни и те же типы, и принять их. Методы в нашем решении взаимодействия теперь выглядят так:

using namespace System::Runtime::InteropServices;

...

virtual void LockDoc(
CFIWarningList ^oWarnings,
CBaseDoc ^oBaseDoc,
// Output
[Out] bool %rbWasAlreadyLocked
) override;
1

Вы можете попробовать использовать тип данных Object вместо Boolean. После этого вы можете разобрать его в Boolean.

0
По вопросам рекламы [email protected]