接口树结构的方差

时间:2015-06-26 21:08:17

标签: c# .net oop covariance

我正在努力在一个树层次结构中进行投射,下面是一个类层次结构的例子,如果有人能指出我正确的方向,我真的很感激。

我无法施放

var myobj2 = (IR<JB>)JR;

类:

public class BASEA{ }
public class B: BASEA{ }
public class C: B{ }

public interface IR<T> { }

public abstract class JR<T> : IR<T> where T : B
{ public abstract void SetRule(); }


public class Action: JB<C>
{
    public override void SetRule()
    {
       //Logic
    }
}

public static class RuleLib 
{

    public static void ApplyTest<T>(T obj, IR<T> JB) where T:B
    {
        var myobj2 = (IR<JB>)JR; //=> does not cast!
    }
}
public class Test
{
    [Test]
    public void demo()
    {
        var obj = new B();
        var action = new Action();
        RuleLib.ApplyRule(obj,action);
    }
}

1 个答案:

答案 0 :(得分:4)

为此,您的IRule界面需要协变。给出here的示例显示了以下协方差:

IEnumerable<Derived> d = new List<Derived>();
IEnumerable<Base> b = d;

这基本上就是你正在做的事情。因此,在您的代码中,您需要做的就是编写

public interface IRule<out T> { ... }

而不是

public interface IRule<T> { ... }

这使得您可以从IRule<U>转换为IRule<V>,其中UV的子类(例如从IRule<ShiftAction>转换为{ {1}})。