3

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

今天我一直对 C# 4 中的协变和逆变感到困惑,但我真的看不出有任何可能做我想做的事。注意:所有这些都不是为了解决特定问题,但我想知道是否有任何合法的方法(C# 4 中全新的 co/contra-variance)来解决它。所以,不要发疯...

这里是示例代码:

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 的项目吗?

谢谢大家。

4

1 回答 1

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>.

于 2011-02-24T14:28:16.730 回答