泛型方法的泛型约束踩到的坑

 

最近在实操泛型的时候遇到了一个坑。

首先我写了一个泛型接口

public interface IShow<T>
{
    string GetClassType();
}

接下来我写了一个泛型类B<T>实现了IShow<T>

public class B<T> : IShow<T>
{
    public string GetClassType()
    {
        return typeof(T).Name;
    }
}

写了一个泛型方法

public static void Show2<T>(T t) where T : IShow<T>
{
    Console.WriteLine("接口约束");
}

在调用Show2<T>(T t)方法时报错了

B<string> b = new B<string>();
Show2(b);

不明,明明我的B<T>实现了IShow<T>,为什么报错了,根据提示,我将B<T>改成了这样

public class B<T> : IShow<B<T>>
{
    public string GetClassType()
    {
        return typeof(T).Name;
    }
}

编译通过。

将编译后的dll用ILSpy反编译后发现Show2<T>(T t)方法实际是这样的,原来T外面还包了一层

 


版权声明:本文为Jinguagua原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。