2015-12-16 2 views
10

У меня есть старая линия 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.

+8

Это выглядит * очень * странно для меня. Насколько мне известно, вы никогда не могли напрямую обращаться к аксессуару. Можете ли вы представить короткий, но полный пример, демонстрирующий проблему? –

+0

Если все остальное не удается, я думаю, что отражение может быть использовано в качестве обходного пути. –

+0

foo.Parent = parent должен работать в любой версии C# /. Net ... Можете ли вы опубликовать пример того, что foo.Parent является «More Code». –

ответ

1

Я оставляю это как ответ, ссылка на изображение будет лучше здесь, чем в комментарии.

Так что, если вы хотите использовать VS 2015, но еще использовать тот же старый добрый вариант языка С #, который работал в течение многих лет, вы можете настроить ваш проект целевой конкретной версии:

enter image description here

Это добавляет <LangVersion>5</LangVersion> в csproj.

+0

Это, кажется, не имело эффекта, что заставляет меня думать, что у Ханса Пассана есть правильная идея. –

Смежные вопросы