У меня есть старая линия C# код, который выглядит в основном так:Detect С # во время компиляции
foo.set_Parent(parent);
Он компилируется нормально в течение многих лет. Теперь в VS2015 я получаю ошибку:
CS0571 'Foo.Parent.set': cannot explicitly call operator or accessor
Так что я могу переписать строку как:
foo.Parent=parent;
Это создает штраф в VS2015, но VS2013 дает ошибку:
'Foo.Parent' is not supported by the language; try directly calling accessor methods 'Foo.get_Parent()' or Foo.set_Parent(Foo)'
Таким образом, простое исправление заключается в простое ifdef этих двух строках, основанных на том, какая версия компилятора запущена. Но как вы определяете, какая версия компилятора выполняется?
И для записи нет, я не могу просто диктовать, что каждый в команде одновременно обновляется до VS2015.
Дополнительная информация - Для всех пахнущие крысу, я пойду вперед и вытаскивают жестокую правду, хотя я не думаю, что это изменится ничего. Класс Foo - это древняя сборка Borland, которая все связана с Delphi (и да, мы уходим, но еще нет). Таким образом, фактический код, который составляет до VS2013, выглядит следующим образом:
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);
...
}
Так класс будет экземпляром является Borland.Vcl.TMemo, который является частью старой сборки Delphi.
Это выглядит * очень * странно для меня. Насколько мне известно, вы никогда не могли напрямую обращаться к аксессуару. Можете ли вы представить короткий, но полный пример, демонстрирующий проблему? –
Если все остальное не удается, я думаю, что отражение может быть использовано в качестве обходного пути. –
foo.Parent = parent должен работать в любой версии C# /. Net ... Можете ли вы опубликовать пример того, что foo.Parent является «More Code». –