14

ジェネリック パラメータで使用できる一連の可能な型から特定の型を除外することは可能ですか? もしそうならどのように。

例えば

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 風の邪悪なコードが少し含まれています。

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

除外された一般的な制約がある方がはるかに良いでしょう。

4

1 に答える 1

8

いいえ、型制約を使用してそのような1回限りの除外を行うことはできません。ただし、実行時に実行できます。

public void Foo<T>()
{
     if (typeof(T) == typeof(bool))
     {
         //throw exception or handle appropriately.
     }
}
于 2012-05-17T20:10:33.227 に答える