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


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

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.


10


источник


Ответы:


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

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

enter image description here

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


1