不要认为标题可以解释我在说什么,而且解释起来有点困难,所以我让代码来说话。您可以将其复制+粘贴到 LINQPad 中并将其作为 C# 程序运行,或者作为 Visual Studio 中的常规 c# 项目进行必要的调整(例如:将对 Dump() 的调用更改为 Console.Writeline() 等) -
请注意,如果您取消注释 doStuff 方法中的行,它将无法编译。
我的问题是,当 generic2 已经实现时,为什么我需要演员表Iab<TA,TB>
?这是一些协方差的事情吗?我仍在使用 .NET 3.5。
void Main()
{
doStuff<a,b>();
}
public void doStuff<TA, TB>()
where TA : class, Ia, new()
where TB : class, Ib, new()
{
Iab<TA, TB> x = null;
x = new generic1<TA, TB>();
x.Go().Dump();
//x = new generic2<TA>(); // <-Cannot implicitly convert type 'UserQuery.generic2<TA>' to 'UserQuery.Iab<TA,TB>'. An explicit conversion exists (are you missing a cast?)
x = (Iab<TA, TB>) new generic2<TA>();
x.Go().Dump();
}
public interface Ia
{}
public interface Ib
{}
public class a : Ia
{}
public class b : Ib
{}
public interface Iab<TA,TB>
where TA : class, Ia, new()
where TB : class, Ib, new()
{
string Go();
}
public class generic1<TA, TB> : Iab<TA,TB>
where TA : class, Ia, new()
where TB : class, Ib, new()
{
public string Go()
{
return "generic Base called";
}
}
public class generic2<TA> : Iab<TA,b>
where TA : class, Ia, new()
{
public string Go()
{
return "generic Sub called";
}
}