我正在玩泛型,并且在具有两个泛型参数的方法中尝试将对象强制转换为接口,这是行不通的。下面的代码演示了问题:

    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。

10-02 03:44