2016-10-26 14 views
5

Tôi đã gặp một số hành vi lạ trong Delphi XE4.Làm thế nào để khai báo một loại thiết lập của một loại enum trong một lớp chung

Tôi không thể khai báo loại set trong một lớp chung, trong đó loại thứ tự được khai báo trong cùng một lớp.

Ví dụ:

TTest<T> = class(TObject) 
type 
    TEnumType = (eOne, eTwo, eThree); 
    TEnumTypes = set of TEnumType; 
end; 

Ở trên không biên dịch. Trình biên dịch phát ra lỗi "E2001: Loại thông thường bắt buộc".

Một lớp học không chung chung như

TTest = class(TObject) 
type 
    TEnumType = (eOne, eTwo, eThree); 
    TEnumTypes = set of TEnumType; 
end; 

không biên dịch.

Đối với các lớp tổng quát để biên dịch thành công, loại thứ phải được khai báo bên ngoài các lớp:

TEnumType = (eOne, eTwo, eThree); 
TTest<T> = class(TObject) 
type 
    TEnumTypes = set of TEnumType; 
end; 

  1. là hành vi này được coi là một lỗi? Nếu có, nó đã được sửa trong một phiên bản sau?
  2. Có ai có cách giải quyết khác không? Tôi muốn khai báo các loại trong lớp vì chúng được sử dụng riêng trong các phần riêng của lớp này.
+3

trình ở Seattle khỏe. Mới kiểm tra. Có lẽ đó là vấn đề của trình biên dịch XE4. Chúng tôi đã có rất nhiều vấn đề với generics trong lần XE4 .. –

+0

Các câu hỏi có vẻ là offtopic ở đây, nó cần được giải quyết cho Emc. Nhưng câu trả lời là khá rõ ràng, các mã có thể được biên dịch mà không có vấn đề trong phiên bản mới nhất của Delphi, vì vậy 1. nó là lỗi và nó là cố định và 2. bạn đề nghị một workaround trong câu hỏi của bạn - xác định TEnumType bên ngoài lớp chung (trong thực hiện nếu bạn muốn ẩn nó ở chế độ riêng tư). –

+1

@AndreiGalatyn, 1. "Nhưng câu trả lời là khá rõ ràng, mã có thể được biên dịch mà không có vấn đề trong phiên bản mới nhất của Delphi" - Làm thế nào là ** rõ ràng ** nếu OP có XE4? 2. Sử dụng phần thực hiện sẽ không hoạt động vì OP cần các trường TEnumType riêng được khai báo trong phần giao diện. – kobik

Trả lời

4

Từ nhìn vào theo dõi vấn đề nó có vẻ là một hồi quy xung quanh XE3/XE4 mà đã cố định trong các phiên bản sau:

+0

Lưu ý rằng [QualityCentral hiện đã bị tắt] (https://community.embarcadero.com/blogs/entry/quality-keeps-moving-forward), vì vậy bạn không thể truy cập vào liên kết 'qc.embarcadero.com' nữa . Nếu bạn cần truy cập vào dữ liệu QC cũ, hãy xem [QCScraper] (http://www.uweraabe.de/Blog/2017/06/09/how-to-save-qualitycentral/). –

5

Đây thực sự là lỗi được sửa trong các phiên bản sau. Mã của bạn biên dịch trong XE7 ví dụ. Khá có thể nó sẽ biên dịch trong XE5 hoặc XE6, nhưng tôi không có chúng ngay lập tức để tay để kiểm tra.

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