最近在实操泛型的时候遇到了一个坑。
首先我写了一个泛型接口
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外面还包了一层