不熟悉C#和泛型,所以我可能会遗漏一些明显的东西,但是:
假设:
public interface IA { }
public interface IB
{ void DoIt( IA x );
}
public class Foo<T> : IB where T : IA
{
public void DoIt( IA x )
{ DoIt(x); // Want to call DoIt( T y ) here
}
void DoIt( T y )
{ // Implementation
}
}
1)为什么方法void DoIt(T y)
不满足接口DoIt
所需的IB
方法实现?
2)如何在DoIt(T y)
内致电DoIt( IA x )
?
答案 0 :(得分:3)
1)因为任何T
是 IA
(这是从约束中提供的),但不是每个IA
都是 { {1}}:
T
2)如果你确定class A : IA {}
class B : IA {}
var foo_b = new Foo<B>();
var a = new A();
// from the point of IB.DoIt(IA), this is legal;
// from the point of Foo<B>.DoIt(B y), passed argument is not B
foo_b.DoIt(a);
是x
,那么使用演员:
T
如果public void DoIt( IA x )
{
DoIt((T)x);
}
可以是任何内容,并且x
可以是可选的,请使用DoIt(T)
:
as
否则,您可以抛出异常或考虑其他方法,具体取决于具体的用例。