我正在玩泛型,并且在具有两个泛型参数的方法中尝试将对象强制转换为接口,这是行不通的。下面的代码演示了问题:
private void GenericMethod<T, U>()
where T : Block
where U : IBlock
{
var list = new List<T>();
// this casting works
var item = new Block();
var iItem = (IBlock)item;
foreach (var l in list)
{
// this doesn't compile
var variable = (U)l;
}
}
这里Block是一个类,IBlock是由该类实现的接口。
为什么铸造(U)l失败?我该怎么做?
最佳答案
如果T从Block继承,而U从IBlock继承,则即使Block从IBlock继承,也不意味着T将从U继承。例如:
public class TBlock : Block
{
public void NewMethod() {}
}
public interface UIBlock : IBlock
{
void AnotherNewMethod();
}
要使此示例正常工作,您必须进行更改
where T : Block
where U : IBlock
至
where U : IBlock
where T : Block, U
确保T继承自U。