【发布时间】:2013-05-24 01:36:11
【问题描述】:
所以我有以下简单的包装类:
interface IReference<out T> where T : myAbstractBase {
T Value { get; }
}
public class Reference<T> : IReference<T> where T : myAbstractBase
{
private T _value = null;
public T Value { get { return _value; } }
}
在我的整个应用程序中,我希望收集这些 IReference<someClass> 对象(其中 someClass 实现 myAbstractBase)
private List<Reference<shapes>> shapeList = new Collection<Reference<shapes>>();
但我希望能够将各种不同的形状添加到这个集合中。 (特别是因为形状也是抽象的)。当然,这会产生错误:
shapeList.Add( new Reference<circle>(){ radius = 2; } );
The value "Reference[circle]" is not of type "Reference[shape]" and cannot be used in this generic collection.
有什么方法可以设计我的Reference<T> 类,只要A 是B 类型,Reference<A> 就会被认为是Reference<B> 类型?
在我看来,人们在尝试使用 Nullable 等列表时会遇到同样的问题。
我已经尝试实现隐式运算符来在 Reference 和 T 之间进行转换,但我没有想到它们有什么实际用途...
public class Reference<T> ... {
...
public static implicit operator Reference<T>(T value)
{
return new Reference<T> { _value = value, };
}
public static implicit operator T(Reference<T> value)
{
return value.Value;
}
}
对于任何对我的意图感到好奇的人,这都是(命运多舛的)尝试为一组类实现延迟加载而不必向这些类添加更多内容的一部分。
【问题讨论】:
-
您必须使用
,而这不适用于您的界面。 -
@newStackExchangeInstance 你知道,我不知道为什么那个界面是这样的。它来自今天早些时候的这个问题:stackoverflow.com/questions/16795750/…,但即使将 T 定义为不变量,接口似乎也能完成它的工作。
-
维基百科 (en.wikipedia.org/wiki/…) 说
IList<T>类型的构造函数是不变的,所以没有两个列表是另一个列表的子类型。这是否意味着这是列表的失败原因? -
是否使用
IReferences列表而不是References为您工作:List<IReference<Shape>> shapeList = new List<IReference<Shape>>(); -
@steaks,这不起作用,因为与我的
Reference<T>隐式转换器不同,我无法为 Interface 类定义隐式转换器,所以我无法像List<IReference<circle>> circleList.Add( new circle() )我现在可以(因为它会自动将圆圈转换为Reference<Circle>)
标签: c# oop generics inheritance