2009-06-05 12 views
5

Come può un programma C# rilevare che viene compilato con una versione di C# che non contiene il supporto per le funzionalità del linguaggio utilizzate in quel programma?Come si può compilare il codice C# per richiedere un determinato linguaggio o versione del compilatore?

Il compilatore C# rifiuterà il programma e produrrà alcuni messaggi di errore, incontrando le caratteristiche del linguaggio che non supporta. Questo non risolve il problema, che è quello di indicare che il programma è compilato con una vecchia versione del compilatore C#, o un compilatore C# che non supporta la versione richiesta di C#

Idealmente, sarebbe come semplice come

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

risposta

4

io non credo che si può fare con un file C#, ma se si sta utilizzando MSBuild quindi il numero di versione progetto/soluzione strumenti può impedire che venga costruito con una versione precedente di MSBuild .

Puoi fornire il contesto esatto di questo? Una soluzione "umana" piuttosto che tecnica potrebbe essere quella di provare a compilare il codice con tutte le versioni "vecchie" e creare un documento con: "Se si verifica un errore come questo probabilmente significa che si sta usando il torto versione ... "

Un'altra opzione da prendere in considerazione per rendere ancora più semplice l'utilizzo di un singolo file" caratteristiche richieste ". Questo non sarebbe utilizzato dalla tua app principale, ma chiedi agli utenti di compilarlo per primo. Se funziona, il resto della build dovrebbe funzionare. In caso contrario, è dovuto all'utilizzo della versione errata. È probabile che produca una gamma più piccola di errori da versioni diverse (in particolare non presenta il problema che il compilatore potrebbe elencare errori da file diversi in un ordine casuale).

+0

Il contesto di questo è la compilazione del codice C# generato dalla macchina, tramite i compilatori della riga di comando, rotto con una varietà di errori perché il compilatore C# precedente (.NET 2005) è stato prelevato sul percorso prima della versione corrente (.NET 2008), e non era immediatamente ovvio che il bug non fosse nel generatore del codice C#. – grrussel

+0

Okay - questi compilatori vengono eseguiti in una sorta di script? Se è così, è qui che il file RequiredFeatures.cs sarebbe utile. –

+0

È possibile evidenziare la caratteristica specifica 4.0 a cui si fa riferimento? In che modo è diverso da/langVersion? Sarei interessato a vedere che cosa fa con l'esempio che ho dato qui sotto ... –

3

In base a this list delle direttive del preprocessore, non sembra possibile. Di solito possiamo dire usando generics (rileva 2.0), usando proprietà auto (3.0) o dinamico (4.0)

2

Non esiste un simbolo predefinito per questo; puoi creare i tuoi simboli e definirli nel tuo script di costruzione. Si noti che è possibile correggere la versione della lingua a livello di progetto:

Proprietà del progetto -> Build -> Avanzate -> Versione linguaggio:

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

(mappe al parametro csc /langversion)

Ma notare che questo non copre tutto - ci sono alcune cose che questo sarà lasciato passare - pa particolarmente nel campo dell'inferenza di tipo generico. Questo è solo un problema se devi supportare vecchi compilatori; nel qual caso ... test con un vecchio compilatore.

Ad esempio:

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

Questo funziona in .NET 3.5/ISO-2 (pseudo C# 2.0), ma non funziona in .NET 2.0 (corretta C# 2.0).

1

Facile: il compilatore fallirà e ti darà un errore se non è possibile compilare il codice.

+0

Non credi? – Will

Problemi correlati