是一部分有可能做到这一点,你需要创建类似于C++的enable_if
public class ClassTag<V> where V : class { }
public class StructTag<V> where V : struct { }
public void Func<V>(V v, ClassTag<V> dummy = null) where V : class
{
Console.Writeln("class");
}
public void Func<V>(V v, StructTag<V> dummy = null) where V : struct
{
Console.Writeln("struct");
}
public void Func<V>(V? v, StructTag<V> dummy = null) where V : struct
{
Console.Writeln("struct?");
}
static void Main()
{
Func("A");
Func(5);
Func((int?)5);
}
它可以扩展为使用任何不相交的where
来区分过载。 唯一的缺点是它不能在另一个内部通用的方法来使用:
public static void Z1<T>(T t) // where T : class
{
Func(t); //error there
}
public static void Z2<T>(T t) where T : class
{
Func(t); //ok
}
编辑 但在这种情况下,使用dynamic
的可能性来解决此限制:
public static void Z1<T>(T t)
{
Func((dynamic)t); //if `T == int` it will call "struct" version
}
唯一的缺点运行时间成本类似于调用Dictionary<,>
索引。
的可能的复制[通用的限制,其中,T:struct和其中T:类](http://stackoverflow.com/questions/2974519/generic-constraints-where-t-struct-and-where-叔类)。另见Eric Lippert的文章[here](http://blogs.msdn.com/b/ericlippert/archive/2009/12/10/constraints-are-not-part-of-the-signature.aspx)。 –
@Frederic:我怎么错过那个! –
显然,边栏中的“相关”窗格也没有选择它,所以它可能比平常更复杂;) –