2015-12-16 19 views
10

Ich habe eine alte Linie von C# -Code, die im Grunde wie folgt aussieht:bei der Kompilierung

foo.set_Parent(parent); 

Es hat sich seit Jahren in Ordnung zusammengestellt. Jetzt in VS2015 erhalte ich die Fehlermeldung:

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

So kann ich die Linie umschreiben als:

foo.Parent=parent; 

Das in VS2015 fein baut, aber in VS2013 gibt es den Fehler:

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

Die einfache Lösung besteht also einfach darin, diese zwei Zeilen basierend auf der Version des Compilers zu definieren. Aber wie erkennen Sie, welche Version des Compilers ausgeführt wird?

Und für die Aufzeichnung, nein, ich kann nicht einfach diktieren, dass jeder im Team gleichzeitig auf VS2015 aktualisiert.

Zusatzinfo - Für alle, eine Ratte Riechen, ich gehe voran und ziehen Sie die hässliche Wahrheit heraus, obwohl ich nicht glaube, es so gut wie nichts ändern wird. Die Klasse Foo stammt aus einer uralten Borland-Versammlung, die in Delphi gebunden ist (und ja, wir ziehen weg, aber noch nicht dort). Also der eigentliche Code, die zu VS2013 kompiliert up, sieht wie folgt aus:

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); 
     ... 
     } 

So ist die Klasse instanziiert wird Borland.Vcl.TMemo ist, die einen Teil der alten Delphi Montage ist.

+8

Das sieht * sehr * seltsam für mich aus. Sie konnten einen Accessor noch nie direkt aufrufen, soweit mir bekannt ist. Können Sie ein kurzes, aber vollständiges Beispiel zur Veranschaulichung des Problems bereitstellen? –

+0

Wenn alles andere fehlschlägt, stelle ich mir vor, Reflexion könnte als Workaround verwendet werden. –

+0

foo.Parent = Eltern sollte in jeder Version von C# /. Net arbeiten ... Können Sie ein Beispiel dafür, was foo.Parent ist "More Code". –

Antwort

1

Ich lasse dies als eine Antwort, die Verknüpfung eines Bildes wird hier besser passen als in einem Kommentar.

enter image description here

:

Also, wenn Sie 2015 VS verwenden möchten, aber immer noch die gleiche gute alte Version der Sprache C#, die jahrelang gearbeitet haben, können Sie Ihr Projekt gezielt eine bestimmte Version konfigurieren

Dies fügt <LangVersion>5</LangVersion> in der csproj.

+0

Das scheint keine Wirkung zu haben, was mich zu der Annahme bringt, dass Hans Passant die richtige Idee hat. –

Verwandte Themen