.net - 有机会合法投吗?

标签 .net generics c#-4.0 covariance contravariance

这是我第一次在这里发布问题,所以在此先感谢任何能帮助我(也许还有其他人)的人。

今天,我一直对 C# 4 中的协变和逆变感到困惑,但我真的看不到任何我想做的事情的可能性。 注意:所有这些都不是 来解决特定问题,但我想知道是否有任何合法的方法(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 的衍生物。 当然,我可能会使用非通用集合或列表,然后游戏就结束了。 另一个想法是有一个更通用的接口(interface) IBaseCore,然后 IBase 继承自。 我的问题是:如果没有这些技巧,我可以实现拥有 IBase 的集合并添加任何 IBase 的项目吗?

谢谢大家。

最佳答案

编辑:首先,IBase<T> 的方差是错误的.应该是out T (协变)而不是 in T (逆变)。

这里的问题很简单,泛型协变和逆变不适用于值类型作为类型参数。所以你可以添加 Readable<string> , 但不是 Readable<bool> .

一个选择是拥有一个非通用的基础接口(interface):

public interface IBase
{
    object GetValueAsObject();
}

public interface IBase<out T> : IBase
{
    T GetValue();
    ...
}

然后你可以有一个List<IBase> .

关于.net - 有机会合法投吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5105883/

相关文章:

sql-server - sql geography 到 dbgeography?

c# - WindowsService的简单安装

c# - 如何检查一个类的所有公共(public)方法都是虚拟的

c# - 单个 WebClient 实例的证书验证逻辑

c# - 这些比较应该返回什么?

c# - FileContentResult 有效,但下载到字节数组无效

javascript - 如何在 TypeScript 中输入可配置的工厂函数?

swift - 为什么我会收到错误 “Protocol … can only be used as a generic constraint because it has Self or associated type requirements” ?

C# 通用约束未按预期工作

c# - 可以在 C# 和 LINQ Lambda 表达式中使用 "in"类型语句吗?