2009-06-05 9 views
5

¿Cómo puede detectar un programa C# que se está compilando en una versión de C# que no admite las características del lenguaje utilizadas en ese programa?¿Cómo se puede hacer la compilación del código C# para que requiera un idioma determinado o la versión del compilador?

El compilador de C# rechazará el programa y generará algún mensaje de error al encontrar las características del idioma que no admite. Esto no soluciona el problema, que es afirmar que el programa se está compilando con una versión demasiado antigua del compilador de C#, o un compilador de C# que no admite la versión requerida de C#

Idealmente, sería como simple como

#if CS_VERSION < 3 
#error CSharp 3 or later is required 
#end 

Respuesta

4

no creo que pueda hacer eso con un archivo C#, pero si usted está utilizando MSBuild entonces el número de versión de las herramientas del proyecto/solución puede evitar que se está construyendo con una versión anterior de MSBuild .

¿Puedes dar el contexto exacto de esto? Una solución "humana" en lugar de técnica puede ser intentar compilar el código con todas las versiones "antiguas" y crear un documento con: "Si obtiene un error como esto, probablemente significa que está usando el error versión ... "

Otra opción que quizás desee considerar para simplificar aún más es tener un solo archivo de" características requeridas ". La aplicación principal no la usará, pero solicite a los usuarios que la compilen primero. Si funciona, el resto de tu compilación debería funcionar. Si no es así, se debe a usar una versión incorrecta. Es probable que produzca un rango menor de errores de diferentes versiones (en particular, no tiene el problema de que el compilador pueda enumerar errores de diferentes archivos en un orden aleatorio).

+0

El contexto de esta es la compilación de la máquina genera código C#, a través de los compiladores de línea de comandos, rompió con una variedad de errores debido a que la mayor compilador de C# (.NET 2005) fue recogido en el camino antes de la versión actual (.NET 2008), y no fue inmediatamente obvio que el error no estaba en el generador del código C#. – grrussel

+0

Bien, ¿se están ejecutando esos compiladores en algún tipo de script? Si es así, ahí es donde el archivo RequiredFeatures.cs sería útil. –

+0

¿Puedes destacar la función específica 4.0 a la que te refieres? ¿Cómo es esto diferente a/langVersion? Me interesaría ver qué hace con el ejemplo que brindé a continuación ... –

3

De acuerdo con this list de las directivas de preprocesador, no parece posible. Generalmente podemos decir usando genéricos (detecta 2.0), usando propiedades automáticas (3.0) o dinámicas (4.0)

2

No hay un símbolo predefinido para esto; puedes crear tus propios símbolos y definirlos en tu script de construcción. Tenga en cuenta que puede fijar la versión del idioma a nivel de proyecto:

Propiedades del proyecto -> Build -> Avanzado -> Versión del lenguaje:

  • ISO-1 es C# 1.2
  • ISO-2 es C# 2.0

(mapas en el parámetro csc /langversion)

Pero tenga en cuenta que esto no cubre todo - hay algunas cosas que esto le permitirá a través - pa especialmente en el área de la inferencia de tipo genérico. Esto es solo un problema si necesita soportar viejos compiladores; en cuyo caso ... prueba con un viejo compilador.

Por ejemplo:

int[] arr1 = { 1, 2, 3, 4, 5 }; 
string[] arr2 = Array.ConvertAll(arr1, delegate (int i) {return i.ToString();}); 

Esto funciona en .NET 3,5/ISO-2 (pseudo C# 2,0), pero no funciona en .NET 2.0 (Proper C# 2.0).

1

Fácil: El compilador producirá un error y le dará un error si no se puede compilar el código.

+0

¿No crees? – Will

Cuestiones relacionadas