如何将特定类型转换为通用类型

How to convert a specific type to a generic type

我有以下 classes:

这是 Parameter.cs

的当前 class 定义
public abstract class Parameter<T> where T: IComparable{
     // class methods...
}

然后 class 定义 CurrentLod.cs

public class CurrentLod : Parameter<String>{
     
     // Constructor
     public CurrentLod() : base()
}

然后,在第三个文件中

new List<Parameter<IComparable>>() { new CurrentLod() }

前面的代码无法编译,编译器显示错误消息:“无法从 CurrentLod 转换为参数”

我相信它与协变和逆变有关,但我仍然不清楚。

您的 List<T> 被定义为接受任何 Parameter<IComparable>CurrentLodParameter<IComparable> 的特定类型,即 Parameter<String>.

我们稍后可能会定义另一种类型 Foo : Parameter<Int32>,因为 Int32 也实现了 IComparable

但是将 Foo 添加到 CurrentLod 的列表中意味着什么?

为了解决您的问题,您可以为参数类型创建一个 non-generic 基础 class 或接口,并将其用作列表的类型,例如:

public abstract class Parameter
{
    // Common paramater operations/properties. This could be an interface.
}

public class Parameter<T> : Parameter where T : IComparable
{
    // Type-specific generic members.
}

public class Int32Parameter : Parameter<Int32>
{
    // Int32 Parameter implementation
}

public class StringParameter : Parameter<String>
{
    // String Parameter implementation
}

// This unit test will compile and pass
public class UnitTest1
{
    [Fact]
    public void Test1()
    {
        var l = new List<Parameter>();
        l.Add(new StringParameter());
        l.Add(new Int32Parameter());

        Assert.Equal(2, l.Count);
    }
}

现在 List 被定义为包含一个特定的类型。当您从列表中检索一个项目时,您需要测试它的具体类型并适当地转换它。