2015-12-16 23 views
10

Ho una vecchia linea di codice C# che appare sostanzialmente in questo modo:Rileva C# versione al momento della compilazione

foo.set_Parent(parent); 

E ha compilato bene per anni. Ora, in VS2015 ottengo l'errore:

CS0571 'Foo.Parent.set': cannot explicitly call operator or accessor

così posso riscrivere la linea come:

foo.Parent=parent; 

Si costruisce bene in VS2015, ma in VS2013 dà l'errore:

'Foo.Parent' is not supported by the language; try directly calling accessor methods 'Foo.get_Parent()' or Foo.set_Parent(Foo)'

Quindi la semplice correzione è semplicemente di ifdef queste due linee in base a quale versione del compilatore è in esecuzione. Ma come si rileva quale versione del compilatore è in esecuzione?

E per la cronaca, no, non posso semplicemente dettare che tutti nel team aggiornano simultaneamente a VS2015.

Ulteriori informazioni - Per tutti l'odore di un ratto, io vado avanti e trascinare fuori la brutta verità, anche se non credo che cambierà molto di nulla. La classe Foo proviene da un'antica assemblea Borland legata a Delphi (e sì, stiamo migrando ma non ancora lì). Così il codice vero e proprio, che compila fino a VS2013, si presenta così:

using Borland.Vcl; 
using RepGen; 
using SnapReportsForm; 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Runtime.InteropServices; 

namespace MigrantCOM { 
    [ComVisible(true)] 
    [Guid("48245BA3-736B-4F98-BDC5-AD86F77E39F4")] 
    [ProgId("MigrantCOM.Exports")] 
    [ClassInterface(ClassInterfaceType.AutoDual)] 
      public class MigrantCLRExports { // : MarshalByRefObject 
     public string Test(string s) { return s+s; } 
    } 

    [ComVisible(true)] 
    [Guid("1154D364-B588-4C31-88B9-141072303117")] 
    [ProgId("MigrantCOM.SnapRepCOM")] 
    [ClassInterface(ClassInterfaceType.AutoDual)] 
    public class SnapRepCOM { 
     TRepGen repGen; 
     TStringList snapRefs=new TStringList(); 
     TForm parent=new TForm(null); 
     TMemo designerMemo; 
     List<TReference> references=new List<TReference>(); 
     TRunAsSnapContext runAsSnapContext=new TRunAsSnapContext(); 

     public SnapRepCOM() { 
     designerMemo=new TMemo(parent); designerMemo.set_Parent(parent); 
     ... 
     } 

Quindi la classe di essere istanziata è Borland.Vcl.TMemo che fa parte del vecchio gruppo di Delphi.

+8

Sembra * molto * strano per me. Non sei mai stato in grado di chiamare direttamente una Accessor per quanto ne so. Potete fornire un esempio breve ma completo che dimostri il problema? –

+0

Se tutto il resto fallisce, immagino che la riflessione possa essere usata come soluzione alternativa. –

+0

foo.Parent = parent dovrebbe funzionare in qualsiasi versione di C# /. Net ... Puoi pubblicare un esempio di cosa foo.Parent è "More Code". –

risposta

1

Sto lasciando questo come risposta, il collegamento di un'immagine si adatta meglio qui che in un commento.

Quindi, se si desidera utilizzare VS 2015, ma ancora utilizzare la stessa versione good ol' del linguaggio C# che ha lavorato per anni, è possibile configurare il vostro progetto per indirizzare una versione specifica:

enter image description here

Questo aggiunge <LangVersion>5</LangVersion> nel csproj.

+0

Questo non sembra aver avuto un effetto, il che mi fa pensare che Hans Passant abbia la giusta idea. –

Problemi correlati