Исключение типов в общих ограничениях (возможно?)

Возможно ли исключить определенные типы из набора возможных типов, которые можно использовать в универсальном параметре? Если так, как.

Например

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

будет означать любой тип, кроме типа Bool.

Edit

Зачем?

Следующий код - моя попытка применить отрицательное ограничение.

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.

Закомментируйте раздел со сделками с примером предполагаемого типа, и он не работает.

Было бы намного лучше иметь исключенное общее ограничение.

 Adam Speight19 мая 2012 г., 05:57
Должен быть принят, потому что он был разыгран, и последующее использование будет Object, пока вы не приведете его обратно к bool.
 vcsjones18 мая 2012 г., 15:05
@ AdamSpeight А что происходит, когда кто-то делаетvar liftedBool = Lifted.Lift((object) false); bool liftedBoolValue = (bool)liftedBool.Value;
 Adam Speight18 мая 2012 г., 00:06
См. Обновленную редакцию исходного сообщения.
 Henk Holterman17 мая 2012 г., 22:17
Какая польза?where T : x средстваT обладает возможностямиx. Негативное ограничение кажется бессмысленным.
 zmbq17 мая 2012 г., 22:43
Почему вы хотите это сделать? Чего ты пытаешься достичь?

Ответы на вопрос(1)

вы не можете делать одноразовые исключения, такие как ограничения типа. Вы можете сделать это во время выполнения, хотя:

public void Foo<T>()
{
     if (typeof(T) == typeof(bool))
     {
         //throw exception or handle appropriately.
     }
}
 vcsjones17 мая 2012 г., 22:19
@ AdamSpeight То, о чем вы сейчас просите, невозможно. Типы должны быть ограничены тем, что ониможе быть, не то, что они не могут быть.
 Adam Speight17 мая 2012 г., 22:27
Так как в F # вы можете ограничить это: not struct
 vcsjones17 мая 2012 г., 22:30
@ AdamSpeight F #'snot не работает везде, только наstruct. Вы не можете сказатьnot bool в F #.not struct то же самое, что и CFoo<T>() where T:class. Да, это ограничение CLR.
 Adam Speight17 мая 2012 г., 22:18
Я не фанат проверки универсальных типов во время выполнения, когда, возможно, есть вероятность, что компилятор может применить его во время компиляции.
 Adam Speight17 мая 2012 г., 22:24
Это ограничение CLR?

Ваш ответ на вопрос