2012-05-17 10 views
8

可能な型の集合から特定の型を除外することは可能であり、汎用型のパラメータで使用できますか?もしそうなら。一般制約内の型を除外(可能?)

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

例えば

は、bool型を除き、いずれかのタイプを意味しています。

編集

のはなぜ?

次のコードは、負の制約を適用しようとしたものです。

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; } 
    } 
    } 
} 

あなたはそれが過負荷正しいこと、解像度、および@jonskeet -esque悪コードのビットに信仰のビットを必要と見ることができるように。

推論された型の例を扱ったセクションをコメントアウトしても機能しません。

除外されたジェネリック制約を持つ方がずっと良いでしょう。

+2

何が使用されますか? 'T:x'は' T'が 'x'の能力を持つことを意味します。負の制約は意味がないようです。 –

+0

なぜそれをしたいですか?あなたは何を達成しようとしていますか? – zmbq

+0

元の投稿の更新された編集を参照してください。 –

答えて

4

いいえ、型制約を使用するような一度だけの除外はできません。あなたは実行時にそれを行うことができます:

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

私は実行時にジェネリック型をチェックするファンではありません。コンパイラーがコンパイル時にそれを強制する可能性があります。 –

+0

@AdamSpeightあなたが現在求めていることは不可能です。型は、できないものではなく、でき得るものに制限されなければなりません。 – vcsjones

+0

これはCLRの制限ですか? –

0

これは、プログラムの側面のように聞こえます。 おそらく、Aspect Oriented Programmingをコンパイル時にこの制約を提供すると考えることができます。

PostSharpは、この機能を提供する必要があります。

関連する問題