2015-12-16 20 views
10

Tôi có một dòng cũ của C# mã mà trông cơ bản như thế này:Detect C# phiên bản tại thời gian biên dịch

foo.set_Parent(parent); 

Nó đã biên soạn tốt trong nhiều năm. Bây giờ trong VS2015 tôi nhận được lỗi:

CS0571 'Foo.Parent.set': cannot explicitly call operator or accessor

Vì vậy, tôi có thể viết lại những dòng như:

foo.Parent=parent; 

này được xây dựng tốt trong VS2015, nhưng trong VS2013 nó mang lại cho các lỗi:

'Foo.Parent' is not supported by the language; try directly calling accessor methods 'Foo.get_Parent()' or Foo.set_Parent(Foo)'

Vì vậy, sửa chữa đơn giản là chỉ đơn giản là ifdef hai dòng dựa trên phiên bản của trình biên dịch đang chạy. Nhưng làm thế nào để bạn phát hiện phiên bản nào của trình biên dịch đang thực thi?

Và để ghi lại, không, tôi không thể chỉ ra rằng mọi người trong nhóm đồng thời nâng cấp lên VS2015.

Thông tin bổ sung - Đối với mọi người ngửi chuột, tôi sẽ tiếp tục và kéo ra sự thật xấu xí, mặc dù tôi không nghĩ nó sẽ thay đổi nhiều thứ. Lớp Foo đến từ một hội đồng cổ của Borland, tất cả đều bị ràng buộc ở Delphi (và vâng, chúng tôi đang di chuyển nhưng không có). Vì vậy, các mã thực tế, đó biên dịch lên đến VS2013, trông như thế này:

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); 
     ... 
     } 

Vì vậy, các lớp được khởi tạo là Borland.Vcl.TMemo mà là một phần của hội đồng Delphi cũ.

+8

Trông * rất * lạ với tôi. Bạn đã không bao giờ có thể gọi một người truy cập trực tiếp như xa như tôi biết. Bạn có thể cung cấp một ví dụ ngắn nhưng đầy đủ cho thấy sự cố không? –

+0

Nếu mọi thứ khác không thành công, tôi tưởng tượng sự phản chiếu có thể được sử dụng như một giải pháp thay thế. –

+0

foo.Parent = parent nên hoạt động ở bất kỳ phiên bản nào của C# /. Net ... Bạn có thể đăng một ví dụ về foo.Parent là "More Code" hay không. –

Trả lời

1

Tôi để nguyên câu trả lời này, việc liên kết hình ảnh sẽ phù hợp hơn ở đây so với trong nhận xét.

Vì vậy, nếu bạn muốn sử dụng VS 2015 nhưng vẫn sử dụng 'cùng một phiên bản ol tốt về ngôn ngữ C# mà làm việc trong nhiều năm, bạn có thể cấu hình dự án của bạn để nhắm mục tiêu một phiên bản cụ thể:

enter image description here

Điều này thêm <LangVersion>5</LangVersion> vào csproj.

+0

Điều này dường như không có tác dụng, điều đó khiến tôi nghĩ Hans Passant có ý tưởng đúng đắn. –

Các vấn đề liên quan