2011-09-04 23 views
6

Làm cách nào để tiện ích mở rộng sau hoạt động? Tôi đang ràng buộc ComboBoxe đến một enum và trong trường hợp này nó không biên dịch bởi vì nó trả về null.Làm thế nào để thực hiện một phương pháp chung cho phép trả về null và chấp nhận enum?

public static T GetSelectedValue<T>(this ComboBox control) 
{ 
    if (control.SelectedValue == null) 
     return null; 

    return (T)control.SelectedValue; 
} 

Lưu ý: Tôi muốn nó trả về null (thay vì mặc định (T)). Câu hỏi đặt ra là biểu thức mà tôi phải sử dụng ở đâu?

+0

bài đăng sau đây trả lời câu hỏi của bạn về việc trả về null từ phương thức chung: http://stackoverflow.com/questions/302096/how-can-i-return-null-from-a-generic-method-in-c – Waqas

Trả lời

5

Return một nullable thay vì một đồng bằng T:

public static T? GetSelectedValue<T>(this ComboBox control) where T : struct 
{ 
    if (control.SelectedValue == null) 
     return null; 

    return (T)control.SelectedValue; 
} 
5

Điều đó là không thể. Các loại giá trị không được rỗng. Phương thức mở rộng của bạn trả về một thể hiện của T và nếu T này là một enum (loại giá trị), giá trị của nó không được rỗng. Vì vậy, mà không thay đổi kiểu trả về của bạn, kiểu chữ ký đơn giản như vậy không thể tồn tại. Theo như ràng buộc các tham số chung là một enum, đó cũng là không thể trong C# nhưng có thể trong MSIL. Jon có blogged about it.

+0

những gì nếu anh ta trả về mặc định thay vì null? – Tim

+0

@Tim, tất nhiên điều đó sẽ hoạt động và cách chính xác để viết phương pháp mở rộng này nhưng OP đã biết điều này bởi vì ông đã đề cập đến nó trong câu hỏi của mình. Tôi chỉ cố gắng giải thích cho anh ta rằng chữ ký của phương thức chung mà anh ta đang cố gắng viết đơn giản là không thể tồn tại. –

+0

@Darin: Cảm ơn câu trả lời, trong trường hợp của tôi, gợi ý đã được Konrad trả lời hữu ích. –

1

Phương pháp phổ biến nhất trong trường hợp này là một trong số tất cả các thành viên khác của liệt kê của bạn xác định None, trong trường hợp đó trong bạn Logic None == null.

+0

Yup, nó hữu ích, tôi nghĩ rằng nó chỉ OK bằng cách gán '0' cho giá trị' None' và để tiện ích mở rộng trả về 'mặc định (T)' –

+0

@French Boy: điều này đơn giản và dễ đọc, cách tự nhiên nhất để giải quyết loại vấn đề. – Tigran

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