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.
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? –
Jeśli wszystko inne zawiedzie, wyobrażam sobie, że refleks może być użyty jako obejście tego problemu. –
foo.Parent = rodzic powinien działać w dowolnej wersji C#/.Net ... Czy możesz podać przykład tego, co foo.Parent to "More Code". –