【问题标题】:Detect c# version at compile time在编译时检测 c# 版本
【发布时间】:2015-12-16 16:39:52
【问题描述】:

我有一行旧的 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 程序集的一部分。

【问题讨论】:

  • 这对我来说看起来非常很奇怪。据我所知,您永远无法直接调用访问器。您能否提供一个简短但完整的示例来说明问题?
  • 这个问题有用吗? stackoverflow.com/questions/3436526/…
  • 您的问题在于代码,并且由于编译器错误而从您那里抽象出来。发布一个完整的例子,我们会提供一些帮助。
  • 您要求修复错误。根本问题是您使用的互操作库。 Roslyn 确实知道在 4.0 之前由 .NET 工具生成的库存在问题,这可能与此有关。运行 Tlbimp.exe 版本 4 或更高版本应该是真正的修复。

标签: c# preprocessor-directive


【解决方案1】:

我将把这个作为答案,在这里链接图片比在评论中更适合。

因此,如果您想使用 VS 2015,但仍然使用已使用多年的 C# 语言的相同良好 ol' 版本,您可以将项目配置为针对特定版本:

这会在 csproj 中添加 &lt;LangVersion&gt;5&lt;/LangVersion&gt;

【讨论】:

  • 这似乎没有任何效果,这让我觉得 Hans Passant 的想法是对的。
猜你喜欢
  • 1970-01-01
  • 2011-04-05
  • 2011-03-27
  • 1970-01-01
  • 1970-01-01
  • 2011-03-19
  • 2014-11-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多