Mat*_*att 1 c# generics covariance contravariance
给定一个通用属性类:
public class Attribute<T>
{
string Name { get; set; }
T Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
有没有办法让一个包含可枚举的对象包含各种类型的泛型(例如int,string,datetime).
public class AttributableObject
{
IEnumerable<???> attributes { get; set;}
}
Run Code Online (Sandbox Code Playgroud)
反正这样做是否会遇到方差问题?
典型的方法是让泛型类派生自非泛型基类(或接口),然后具有该类型的可枚举:
public abstract class AttributeBase
{
// Non-generic stuff here
}
public class Attribute<T> : AttributeBase
{
// Generic stuff here
}
Run Code Online (Sandbox Code Playgroud)
然后你可以声明:
IEnumerable<AttributeBase> attributes;
Run Code Online (Sandbox Code Playgroud)
当然,如果您想使用任何通用功能(比如实际获取值),您仍然需要知道每个元素的类型.
请注意,协方差/逆变在这里没有用,因为该Value属性既可设置又可获取,因此通用参数是不变的(更不用说它是一个通用类,因此无论如何它都不能成为co/contra-variant .)