2012-05-17 31 views
8

Có thể loại trừ các loại cụ thể khỏi tập hợp các loại có thể, có thể được sử dụng trong thông số chung không? Nếu vậy thì làm sao.Loại trừ các loại trong các ràng buộc chung (có thể?)

Ví dụ

Foo<T>() : where T != bool 

có nghĩa là bất kỳ loại trừ kiểu bool.

Sửa

Tại sao?

Đoạn mã sau là nỗ lực của tôi để thực thi ràng buộc âm.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
    static void Main(string[] args) 
    { 
     var x1=Lifted.Lift("A"); 
     var x2=Lifted.Lift(true); 
    } 
    static class Lifted 
    { 
     // This one is to "exclude" the inferred type variant of the parameter 
     [Obsolete("The type bool can not be Lifted", true)] 
     static public object Lift(bool value) { throw new NotSupportedException(); } 
     // This one is to "exclude" the variant where the Generic type is specified. 
     [Obsolete("The type bool can not be Lifted", true)] 
     static public Lifted<T> Lift<T>(bool value) { throw new NotSupportedException(); } 
     static public Lifted<T> Lift<T>(T value) { return new Lifted<T>(value); } 
    } 

    public class Lifted<T> 
    { 
     internal readonly T _Value; 
     public T Value { get { return this._Value; } } 
     public Lifted(T Value) { _Value = Value; } 
    } 
    } 
} 

Như bạn có thể thấy nó liên quan đến một chút niềm tin vào độ phân giải quá tải là chính xác và bit @jonskeet -quá mã độc ác.

Nhận xét phần có giao dịch với ví dụ về loại phỏng đoán và nó không hoạt động.

Sẽ tốt hơn nhiều nếu bạn có giới hạn chung loại trừ.

+2

Việc sử dụng sẽ là gì? 'trong đó T: x' có nghĩa là' T' có các khả năng 'x'. Một ràng buộc tiêu cực dường như vô nghĩa. –

+0

Tại sao bạn muốn làm điều đó? Bạn đang cố gắng đạt được điều gì? – zmbq

+0

Xem chỉnh sửa được cập nhật trên bài đăng gốc. –

Trả lời

4

Không, bạn không thể thực hiện loại trừ một lần như vậy bằng cách sử dụng các ràng buộc loại. Bạn có thể làm điều đó trong thời gian chạy mặc dù:

public void Foo<T>() 
{ 
    if (typeof(T) == typeof(bool)) 
    { 
     //throw exception or handle appropriately. 
    } 
} 
+0

Tôi không phải là một fan hâm mộ kiểm tra các kiểu generic trong thời gian chạy, khi có khả năng trình biên dịch có thể thực thi nó tại thời gian biên dịch. –

+0

@AdamSpeight Những gì bạn hiện đang yêu cầu là không thể. Các loại nên được hạn chế với những gì chúng * có thể *, không phải những gì chúng không thể. – vcsjones

+0

Đây có phải là hạn chế CLR không? –

0

Điều này nghe giống như một khía cạnh của chương trình. Có lẽ bạn có thể xem xét Lập trình hướng Aspect để cung cấp ràng buộc này tại thời gian biên dịch.

PostSharp nên cung cấp khả năng này.

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