Подтвердить что ты не робот

Обнаружить версию С# во время компиляции

У меня есть старая строка кода С#, которая выглядит в основном так:

foo.set_Parent(parent);

Он составлен отлично в течение многих лет. Теперь в VS2015 я получаю ошибку:

CS0571 'Foo.Parent.set': не может явным образом вызывать оператор или аксессор

Поэтому я могу переписать строку как:

foo.Parent=parent;

Это строит штраф в VS2015, но в VS2013 он дает ошибку:

'Foo.Parent' не поддерживается языком; попробуйте прямо позвонить методы доступа "Foo.get_Parent() 'или 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.

4b9b3361

Ответ 1

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

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

введите описание изображения здесь

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