2014-11-18 3 views
16

Я пробовал VS2015 с моим существующим решением, и я получаю некоторые допустимые новые ошибки (например, недостижимый код, который компилятор раньше не ловил), но я также получаю ошибку, например, в этой строке :C# 6/C++ ref ключевое слово error

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

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

Error CS1503 Argument 3: cannot convert from 'ref bool [mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]' to 'ref bool [mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]'

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

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

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

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

+1

Что такое подпись LockDoc? –

+0

Посмотрел, это C++-функция –

+0

И '%' похоже, является оператором отслеживания C++. Не уверен, как справиться с этим в C#. –

ответ

0

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

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

using namespace System::Runtime::InteropServices; 

... 

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

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

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

Дополнительная информация here.

+0

Что все звучит разумно, но не ново. Поскольку код работает в VS2013, я сомневаюсь, что это вызвано одним из этих случаев, но поправьте меня, если я ошибаюсь. Кроме того, вы можете увидеть объявление параметра ref выше. –

0

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

+1

Или я не мог использовать VS2015, пока это не работает, вместо того, чтобы удалять ввод в сотни мест по всему проекту;) –

1

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

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

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

Смежные вопросы