编辑:更改以使代码更好地识别问题。
我正在调整蒙特卡罗模拟的性能,其中将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的子类)
答案 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
方法提供了错误的类型而造成的,这是一个非常初学者错误。