sintaxis significado reservadas referencia programacion palabras lenguaje guia comandos c# c++ interop roslyn ref

significado - C#6/C++ ref error de palabra clave



referencia de lenguaje c# (4)

Debes marcar este punto para estar seguro.

  1. Sólo los valores de L pueden pasarse por referencia. Los valores L son variables y otras expresiones que pueden aparecer en el lado izquierdo de una asignación. Esto incluye incluir locales, accesos de campo, referencias de punteros y accesos de elementos de matriz. Los valores L no incluyen accesos a propiedades, que no tienen una dirección de máquina identificable, ni incluyen campos de solo lectura, que están restringidos por el CLR.
  2. Los parámetros de referencia no pueden ser el objetivo de un método de extensión. Las llamadas a los métodos de extensión son caras para los tipos de valor, porque el parámetro "esto" se copia por valor. Esto también significa que los tipos de valor no pueden tener métodos de extensión mutables. Esto contrasta directamente con los métodos de instancia, que pasan el parámetro de tipo de valor "this" por referencia.
  3. Los parámetros de referencia no se pueden utilizar en las funciones de sobrecarga del operador.

Puedes encontrar más información here .

Probé el VS2015 con mi solución existente y obtengo algunos errores nuevos válidos (como el código inalcanzable que el compilador no detectó antes), pero también recibo un error, por ejemplo, en esta línea:

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

Obtuve el siguiente error:

Error CS1503 Argumento 3: no se puede convertir de ''ref bool [mscorlib, versión = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089]'' a ''ref bool [mscorlib, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089] ''

No puedo ver por qué lanzaría ese error, obviamente los tipos coinciden. ¿Se trata de un error en el nuevo compilador o ha cambiado el comportamiento de la palabra clave ref ?

La función en este caso es una función de C ++ que se importa a C # utilizando la clase ac # derivada de la clase c ++. Su firma es esta:

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

Podría ser bueno mencionar que opté por usar el compilador VS2013 c ++ para las fuentes de c ++ en la solución por ahora, por lo que el lado de c ++ debería ser el mismo que antes. Mi conjetura es que algo en la interoperabilidad entre c # y c ++ cambió.


Puedes intentar usar un tipo de datos Objeto en lugar de Booleano. Después de eso podrías analizarlo a Boolean.


Recibo ese tipo de errores de compilación cuando dos proyectos son de tipos incompatibles. Muchas veces, Visual Studio me permite agregar una referencia a un proyecto de Portable Class Library (o proyecto .NET 4.0) incluso cuando el ensamblaje al que se hace referencia no es compatible con el tipo de perfil .NET del proyecto de referencia.

La ocurrencia más común para mí es cuando uso un proyecto .NET 4.0 y trato de hacer referencia a un proyecto de biblioteca de clases probables que especifica .NET 4.5 en su configuración de perfil en lugar de la versión anterior de .NET 4. Cuando hago referencia al ensamblaje PCL de mi proyecto .NET 4.0, continúo obteniendo soporte completo de intellisense (por ejemplo, al editar el código fuente intellisense mostrará todos los espacios de nombres, clases y propiedades contenidas dentro del ensamblaje al que se hace referencia). Pero en el momento de la compilación obtengo el el mismo tipo de error que está recibiendo; más específicamente cuando compilo la solución, la compilación indica una discrepancia de biblioteca, pero enumera exactamente la misma biblioteca, versión y clave pública que dice que está buscando.

Verifique las propiedades del proyecto, verifique que sean compatibles.


Resulta que este error se puede corregir agregando explícitamente un atributo de salida al parámetro.

Añadir [Out] al parámetro ref aparentemente ayuda al nuevo compilador de C # a reconocer que estos son los mismos tipos y los acepta. Los métodos en nuestra solución de interoperabilidad ahora son así:

using namespace System::Runtime::InteropServices; ... virtual void LockDoc( CFIWarningList ^oWarnings, CBaseDoc ^oBaseDoc, // Output [Out] bool %rbWasAlreadyLocked ) override;