如何将特定类型转换为通用类型
How to convert a specific type to a generic type
我有以下 classes:
- Parameter.cs(泛型)
- CurrentLod.cs(具体类型,继承自Parameter)
这是 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>
。 CurrentLod
是 Parameter<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 被定义为包含一个特定的类型。当您从列表中检索一个项目时,您需要测试它的具体类型并适当地转换它。
我有以下 classes:
- Parameter.cs(泛型)
- CurrentLod.cs(具体类型,继承自Parameter)
这是 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>
。 CurrentLod
是 Parameter<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 被定义为包含一个特定的类型。当您从列表中检索一个项目时,您需要测试它的具体类型并适当地转换它。