2012-02-01 27 views
5

Tôi đang cố gắng để tạo ra các tên lớp chữ ký sau đây:Lớp hạn chế phải đến trước khi bất kỳ hạn chế khác

public class MyClass<T> where T : struct, MyBase 

(Tôi đang sử dụng struct để chế ngự để Enums)

Tôi nhận lỗi

The class type constraint 'MyBase' must come before any other constraints 

Tôi hiểu thông báo, tuy nhiên, sắp xếp lại mã tôi không thể vượt qua điều đó hoặc một số lỗi cú pháp khác. Làm thế nào tôi có thể sửa chữa dòng đó nếu có?

Nếu phải làm vậy, tôi sẽ xóa struct.

Cảm ơn bạn

+0

cảm ơn tất cả vì các lựa chọn khác nhau của bạn do các bạn đọc nó theo nhiều cách khác nhau. –

+1

Tin xấu đi chậm, bạn không thể hạn chế đối số kiểu cho System.Enum. Lịch sử không tốt với enums, chúng có cấu trúc không tương thích với các kích thước khác nhau cho kiểu triển khai của chúng. Một tối ưu hóa quá nhiều trong ngôn ngữ C, bị mắc kẹt với C# vì interop. –

Trả lời

7

Ý của bạn là class MyClass<T> : MyBase where T : struct?

+1

Cảm ơn bạn. Khi tôi đã thử một cái gì đó tương tự như thế này, tôi đã thêm một dấu phẩy ','. "Ánh sáng xanh, bẫy sạch sẽ." –

1

Bạn đang xác định <T> là hai loại khác nhau. struct là loại giá trị trong đó là MyBase là một lớp tham chiếu đến loại tham chiếu. Nó không phải là một cái gì đó có thể hoán đổi cho nhau.

Trong trường hợp này nó sẽ là một trong hai:

public class MyClass<T> where T : struct

hoặc

public class MyClass<T> where T : MyBase

Here rất biết thêm thông tin liên quan đến Generics và làm thế nào để sử dụng chúng.

0

Nếu T phải là struct, không thể kế thừa từ bất kỳ loại nào khác ... Loại giá trị không hỗ trợ kế thừa.

16

Ràng buộc là "và-ed" với nhau; tất cả các ràng buộc phải được thỏa mãn.

Trong hoàn cảnh nào T có thể được cả một tổ chức phi nullable kiểu giá trị và cũng được ngầm chuyển đổi thành các MyBase lớp qua sắc, đấm bốc hoặc tham chiếu chuyển đổi?

Không có trường hợp nào như vậy, do đó không có đối số loại có thể thỏa mãn các ràng buộc của T. Thay vì cho phép bạn định nghĩa một tập hợp các ràng buộc mà không thể đáp ứng được, trình biên dịch chỉ đơn giản là không cho phép nó. Bạn không thể nói rằng bạn yêu cầu cả ràng buộc struct và ràng buộc class type.

Tôi đang sử dụng struct để chế ngự enums

Đó minh họa quan điểm của tôi. Vì không có enums kế thừa từ MyBase, nên không thể gặp phải ràng buộc.

Bạn có thể mô tả cho tôi những gì bạn nghĩ rằng điều này có nghĩa không? Ví dụ, bạn có nghĩ rằng nó có nghĩa là "bất kỳ loại giá trị không nullable hoặc bất kỳ loại nào có thể chuyển đổi thành MyBase"? Tôi quan tâm để tìm hiểu tại sao mọi người tin những điều sai lầm về C# để tôi có thể cố gắng cải thiện nó.

CẬP NHẬT: Ah, tôi hiểu - MyBase được dự định là lớp cơ sở là MyClass<T>, không phải là lớp cơ sở là T. Trong C#, nó đi:

class [class name] < [generic type parameters] > 
    : [base classes and interfaces] 
    where [type parameter] : [constraints] 

Bạn có phải đặt các lớp cơ sở và giao diện trước những hạn chế, nếu không trình biên dịch cho rằng họ những hạn chế.

0

Không phải 100% chắc chắn về điều này, nhưng một kiểm tra nhanh của MSDN đi lên với where (generic type constraint) (C# Reference) này:

public class MyClass<T, U> where T : MyBase where U : struct 

Không chắc đó là những gì bạn đang tìm kiếm mặc dù.

+1

Điều này sẽ hợp lệ nếu có bất kỳ dấu hiệu nào cho thấy anh ta cần hai loại paraterized riêng biệt, một loại độc lập với loại khác, nhưng không có dấu hiệu như vậy vào lúc này. Có vẻ như anh ta chỉ đơn giản là có những ham muốn cạnh tranh về các ràng buộc đối với một tham số kiểu duy nhất. –

+0

@AnthonyPegram - Đó là một điểm hợp lệ, mặc dù tôi đọc câu hỏi khác nhau. Nó không hoàn toàn rõ ràng (đối với tôi) những gì OP đang cố gắng để đạt được, đó là lý do tại sao tôi đặt báo trước ở cuối. – Tim