使用继承的泛型类型作为类型约束类的方法的输入

时间:2015-03-12 11:48:59

标签: c# generics inheritance constraints

编辑:更改以使代码更好地识别问题。

我正在调整蒙特卡罗模拟的性能,其中将IComponent转换为IProposition导致了瓶颈。我找到了一位建筑师来拆除铸件,但它没有按预期工作。

TryDo 中的方法调用会引发编译错误? (参数类型' IProposition不能分配给参数类型' T') 为什么? (IProposition满足对T的约束)以及如何解决?

using System.Collections.Generic;

public interface IComponent<T> where T : IComponent<T>
{
    HashSet<T> Inputs { get; }
}

public interface IProposition<T> : IComponent<T> where T : IComponent<T> { }

public interface IAnd<T> : IComponent<T> where T : IComponent<T> {}

class DoStuff<T> where T : IComponent<T>
{
    private void DoIt(T component)
    {
        if (component is IAnd<T>)
            foreach(T input in component.Inputs)
                DoIt(input);
    }

    void TryDo(IProposition<T> proposition)
    {
        DoIt(proposition);
    }
}

(我已经提出了一个单独的解决方案,使用一个单独的类型&#39; TP&#39;来表示IProposition - 但似乎多余,因为肯定IProposition是IComposition的子类)

1 个答案:

答案 0 :(得分:0)

我不确定您希望使用此类型号完成什么,但代码会编译:

public interface IComponent<T> where T : IComponent<T> { }

public interface IProposition<T> : IComponent<T> where T : IComponent<T> { }

class DoStuff<T> where T : IComponent<T>
{
    private void DoIt(T component)
    {
    }

    void TryDo(T component, T proposition)
    {
        DoIt(component);
        DoIt(proposition);
    }
}

我不确定你完全了解泛型是如何工作的。你似乎有一个想法,但我真的不知道这样的代码有什么实际用途。

现在不要误解我的意思,但是你应该花时间研究泛型和c#,一般用更简单的模型。您的代码中的错误是由于向DoIt方法提供了错误的类型而造成的,这是一个非常初学者错误。