Excluding Types in the Generic Constraints (Possible?)

自闭症网瘾萝莉.ら 提交于 2019-11-27 05:55:21

问题


Is possible to exclude specific types from the set of possible types, that can be used in a generic parameter? If so how.

For example

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

would mean any type except for the type bool.

Edit

Why?

The following code is my attempt to enforce the negative constraint.

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

As you can see it involves a bit of faith in the overload resolution being correct, and bit of @jonskeet -esque evil code.

Comment out the section with deals with the inferred type example and it doesn't work.

It would be so much better to have the excluded generic constraint.


回答1:


Nope, you can't make one-off exclusions like that using type constraints. You can do it at runtime though:

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


来源:https://stackoverflow.com/questions/10642751/excluding-types-in-the-generic-constraints-possible

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!