这是我第一次在这里发帖提问,所以提前感谢任何人都会帮助我(也许还有其他人)。
今天我对C#4中的协方差和逆变感到困惑,但我真的看不到任何可能做到的事情。 注意:所有 NOT 都不能解决特定问题,但我想知道是否有任何合法方式(C#4中全新的共同/反向差异)来解决它。 所以,不要发疯...
示例代码:
public interface IBase<in T>
{
T GetValue();
...
}
public class Readable<T> : IBase<T>
{
public T GetValue() {/* */}
...
}
public class Writeable<T> : IBase<T>
{
public T GetValue() {/* */}
public void SetValue(T value) {/* */}
...
}
public class Program
{
private List<IBase<object>> _collection = new List<IBase<object>>();
public static void Main()
{
var p = new Program();
p._collection.Add(new Readable<bool>()); //not allowed
}
}
该集合应该能够承载任何IBase衍生物,是任何T的衍生物。 当然,我可以使用非通用集合或列表,游戏结束。 另一个想法是拥有一个更常见的接口IBaseCore,然后IBase继承。 我的问题是:如果没有这些技巧我可以获得IBase的集合并添加任何IBase的项目吗?
感谢大家。
答案 0 :(得分:3)
编辑:首先,IBase<T>
的方差是错误的。它应该是out T
(协变)而不是in T
(逆变)。
这里的问题很简单,通用协方差和逆变法不能作为类型参数使用值类型。因此,您可以添加Readable<string>
,但不能添加Readable<bool>
。
一种选择是拥有非通用基接口:
public interface IBase
{
object GetValueAsObject();
}
public interface IBase<out T> : IBase
{
T GetValue();
...
}
然后你可以拥有List<IBase>
。