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.
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? –
Se tutto il resto fallisce, immagino che la riflessione possa essere usata come soluzione alternativa. –
foo.Parent = parent dovrebbe funzionare in qualsiasi versione di C# /. Net ... Puoi pubblicare un esempio di cosa foo.Parent è "More Code". –