首页 > 解决方案 > C# 泛型对象不能添加到该泛型类型的列表中

问题描述

抱歉,如果问题名称不是那么明确,但我找不到更好的...

这是我的问题:

我有一堂课:

public class WatchableVariable<T>{
  ...
}

一个容器类:

public class CommonWatchableVariableContainer
{
  private List<WatchableVariable<IComparable>> Watchables;

  ...

  public void Add<T>(string name) where T : IComparable
  {
    WatchableVariable<T> test = new WatchableVariable<T>(name);
    Watchables.Add(test);
  }

  ...
}

并有一个奇怪的错误:

在此处输入图像描述

哪个,IMO,应该可以工作,因为我在我的泛型类型上应用了“IComparable”约束。

有人可以指出我可能搞砸的地方吗?

编辑:我已经尝试在 Class WatchableVariable 上实现 IComparable 导致完全相同的错误:/

public class WatchableVariable<T> : ObservableObject where T : IComparable
  { ... }

编辑 2:在尝试实施 canton7 提出的解决方案时,我意识到我可能会被阻止。

这是我创建的界面:

public interface IWatchableVariable<out T>
{
  T Variable { get; set; }
}

这是我想要实现的目标:

double dVar1 = process();
double dVar2 = process();
double dVar3 = process();

bool bVar1 = process();

CommonWatchableVariableContainer container = new CommonWatchableVariableContainer ();
container.Add<bool>("myTrackedVariable_1");
container.Add<double>("myTrackedVariable_2");

container["myTrackedVariable_1"].Variable = dVar1; //Variable would be a property of type T (which would be double in this case)
container["myTrackedVariable_2"].Variable = bVar1;

foreach(IWatchableVariable WV in container){
  process(WV);
}

container.Remove("myTrackedVariable_1");

这会让事情变得更清楚吗?

标签: c#genericscollectionscasting

解决方案


我不知道您要实现什么目标,但要使这项工作发挥作用,您应该:使用IComparable约束声明您的类型。

public class WatchableVariable<T> where T : IComparable
{
    public WatchableVariable(string name) { }
}

然后使您的第二类具有相同的约束。

public class CommonWatchableVariableContainer<T> where T : IComparable
{
    private List<WatchableVariable<T>> Watchables;

    public void Add(string name)
    {
        var test = new WatchableVariable<T>(name);
        Watchables.Add(test);
    }
}

推荐阅读