2012-11-22 36 views
5

Tôi không thể tin rằng mình không thể google này. Tôi không biết phải làm gì với google.C#: Kiểm tra xem loại T có phải là bool

public static T GetValue<T>(T defaultValue) 
{ 
    if (T is bool) // <-- what is the correct syntax here? 
    return (T)true; // <-- I don't think this works either 
} 

EDIT: Rất tiếc, tôi không đề cập đến, chức năng ở trên chỉ hiển thị câu hỏi của tôi. Nó không phải là một chức năng thực sự. Cảm ơn tất cả mọi người cho câu trả lời!

+0

Thử tìm kiếm lỗi trình biên dịch. Tôi chắc chắn có nhiều bản sao. Ít nhất, * bao gồm * lỗi [biên dịch] trong các câu hỏi khi áp dụng. –

Trả lời

10

Nếu một phải sử dụng cùng một phương pháp/chữ ký này và phải sử dụng các loại T (và có lý do như vậy, mặc dù nếu có không được thì xem câu trả lời Albin của):

public static T GetValue<T>(T defaultValue) 
{ 
    // Need to use typeof to get a Type object for bool, just as with T 
    if (typeof(T) == typeof(bool)) { 
    // Need to say "get out of my way C#" 
    // The first cast to object is required as true (bool) is 
    // otherwise not castable to an unrestricted T. 
    // This widen-restrict approach could result in a cast error, 
    // but from the above check it is known that T is bool. 
    return (T)(object)true; 
    } 
    // .. other stuff that .. does stuff. 
} 

Tuy nhiên, trả lại rõ ràng true (không phải là giá trị mặc định cho boolean) và bỏ qua defaultValue hoàn toàn nếu không có vẻ .. nghi ngờ. Nhưng - It compiles! Ship it!

Ghi chú:

  • Việc sử dụng == cho loại sẽ không hoạt động đáng tin cậy cho lớp con (nhưng không sao vì bool là một cấu trúc để phân nhóm không phải là một vấn đề). Trong những trường hợp đó, hãy xem IsAssignableFrom.
  • typeof(T) không nhất thiết phải là loại giá trị được chuyển vào (có thể là null đối với các loại tham chiếu). Điều này, cùng với các kiểu con, có thể dẫn đến các biến thể tinh tế cho các cách tiếp cận sử dụng is trên giá trị.
+0

+1 để chỉ ra vấn đề của giải pháp này cho các loại phụ. Tôi đã dành hàng giờ cho một vấn đề như vậy một lần. – Guillaume

7

Không kiểm tra các loại, kiểm tra các biến

public static T GetValue<T>(T defaultValue) 
{ 
    if (defaultValue is bool) // <-- what is the correct syntax here? 
    return (T)true; 
} 

Nhưng cũng giống như một bên không, khi bạn làm kiểm tra kiểu và có xử lý khác nhau với nhiều loại khác nhau trong một kiểu generic bạn thường làm gì đó sai .

Tại sao bạn không tạo quá tải cho các loại có xử lý đặc biệt?

public static bool GetValue(bool defaultValue) 
{ 
    return true; 
} 
+0

Ah, cảm ơn, nhưng tôi đã có chức năng này mà đã làm việc cho tất cả các chuỗi/int/double/float/thập phân ngoại trừ bool – Aximili

+2

'(T) true' không hoạt động, tất nhiên – horgh

3

Có thể bạn đang tìm kiếm default(T), trả về giá trị mặc định cho loại được cung cấp. Giá trị mặc định cho boolfalse.

+1

+1: Giả định tốt đẹp! – horgh

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