我需要一组键值元组,其值具有泛型类型。我不想将值声明为System.Object。期望的用法是这样的:
Pair[] pairs = new Pair[]
{
new Pair<int> { Name = "Age", Value = 44 },
new Pair<string> { Name = "FirstName", Value = "Frank" },
};
Pair
定义如下:
public class Pair<T>
{
public string Name { get; set; }
public T Value { get; set; }
}
在声明和初始化pairs
:
使用通用类型&#39; Pair&lt; T&gt;&#39;需要1个类型参数
如果我要更改这样的代码:
Pair<int>[] pairs = new Pair<int>[]
{
new Pair<int> { Name = "Age", Value = 44 },
new Pair<string> { Name = "FirstName", Value = "Frank" },
};
显然会满足Pair<int>
而不是Pair<string>
:
无法隐式转换类型&#39; Pair&lt; string&gt;&#39;到&#39;配对&lt; int&gt;&#39;
如果我要更改这样的代码:
Pair<object>[] pairs = new Pair<object>[]
{
new Pair<int> { Name = "Age", Value = 44 },
new Pair<string> { Name = "FirstName", Value = "Frank" },
};
然后编译错误是(两次):
无法隐式转换类型&#39; Pair&lt; int&gt;&#39;到&#39;配对&lt; object&gt;&#39;
---更新
我不想将Pair.Value声明为对象的原因是我想要定义特殊对,如下所示:
public class AgePair : Pair<int> { }
public class NamePair : Pair<string> { }
答案 0 :(得分:1)
虽然Pair<int>
和Pair<string>
共享Pair<T>
的类定义,但它们在运行时被编译为完全不同的类型。那么,你不能把它们放在IEnumerable<T>
或T[]
类型中。你根本就不能这样做(直接)。
如果您允许类Pair<T>
继承自将类型对象作为Type对象返回的类Pair
,则可以使用IEnumerable<Pair>
或Pair[]
并使用对象分别检查typeof(Value)
。
这是非常不干净的,并且根据其类型而不是它的定义更改结果的实现,这违反了OOP原则并增加了隐藏的复杂性。这正是Key-Value存储通常以字符串字符串或字符串对象的形式完成的原因,其中对象属于在复杂(多个属性和方法)类中定义的类型。