2015-12-16 14 views
10

Mam starą linię C# kod, który wygląda w zasadzie tak:Wykrywanie wersji C# w czasie kompilacji

foo.set_Parent(parent); 

To skompilowany grzywny lat. Teraz w VS2015 pojawia się błąd:

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

Więc mogę przepisać linię jako:

foo.Parent=parent; 

To buduje grzywny w VS2015, ale w VS2013 daje błąd:

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

Tak więc prostą poprawką jest po prostu, jeśli te dwie linie są oparte na uruchomionej wersji kompilatora. Ale w jaki sposób można wykryć, która wersja kompilatora jest wykonywana?

I dla przypomnienia, nie, nie mogę po prostu dyktować, że wszyscy w zespole jednocześnie uaktualniają się do VS2015.

Dodatkowe info - Dla każdego zapachu szczura, pójdę do przodu i wywlec Brzydka prawda, chociaż nie sądzę, że zmieni prawie nic. Klasa Foo pochodzi ze starożytnego zgromadzenia Borlanda, które jest połączone w Delphi (i tak, przenosimy się, ale jeszcze nie istnieje). Tak rzeczywisty kod, który kompiluje się do VS2013, wygląda następująco:

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

więc klasa jest instancja jest Borland.Vcl.TMemo która jest częścią dawnego zespołu Delphi.

+8

To wygląda * bardzo * dziwnie dla mnie. Nigdy nie byłeś w stanie wywołać bezpośredniego dostępu tak daleko, jak o mnie wiadomo. Czy możesz podać krótki, ale pełny przykład demonstrujący problem? –

+0

Jeśli wszystko inne zawiedzie, wyobrażam sobie, że refleks może być użyty jako obejście tego problemu. –

+0

foo.Parent = rodzic powinien działać w dowolnej wersji C#/.Net ... Czy możesz podać przykład tego, co foo.Parent to "More Code". –

Odpowiedz

1

Zostawiam to jako odpowiedź, łączenie obrazu sprawdzi się lepiej niż w komentarzu.

Więc jeśli chcesz użyć VS 2015, ale nadal używać tego samego dobry ol”wersji języka C#, który pracował przez wiele lat, można skonfigurować swój projekt kierować konkretną wersję:

enter image description here

To dodaje <LangVersion>5</LangVersion> w csproj.

+0

Wydaje się, że to nie miało żadnego efektu, co sugeruje, że Hans Passant ma dobry pomysł. –