我在寻找一种将Tuple<List>放入Tuple<IEnumerable>的方法,我发现元组没有协方差。
我决定自己实现一个接口,该接口将子类为一个元组,并支持协方差:
/// <summary>
/// A wrapper around Tuple for gaining covariance
/// </summary>
public static class ITuple
{
private class _ITuple<T1> : Tuple<T1>, ITuple<T1> { public _ITuple(T1 item1) : base(item1) { } }
public static ITuple<T1> Create<T1>(T1 item1) { return new _ITuple<T1>(item1); }
private class _ITuple<T1, T2> : Tuple<T1, T2>, ITuple<T1, T2> { public _ITuple(T1 item1, T2 item2) : base(item1, item2) { } }
public static ITuple<T1, T2> Create<T1, T2>(T1 item1, T2 item2) { return new _ITuple<T1, T2>(item1, item2); }
private class _ITuple<T1, T2, T3> : Tuple<T1, T2, T3>, ITuple<T1, T2, T3> { public _ITuple(T1 item1, T2 item2, T3 item3) : base(item1, item2, item3) { } }
public static ITuple<T1, T2, T3> Create<T1, T2, T3>(T1 item1, T2 item2, T3 item3) { return new _ITuple<T1, T2, T3>(item1, item2, item3); }
}
public interface ITuple<out T1> { T1 Item1 { get; } }
public interface ITuple<out T1, out T2> { T1 Item1 { get; } T2 Item2 { get; } }
public interface ITuple<out T1, out T2, out T3> { T1 Item1 { get; } T2 Item2 { get; } T3 Item3 { get; } }一些测试和使用:
[TestMethod]
public void TestCompile()
{
// no assertion, just test that the compilation work
ITuple<Exception> item = ITuple.Create<NullReferenceException>(null);
ITuple<IEnumerable<int>> item2 = ITuple.Create<List<int>>(null);
}
[TestMethod]
public void TestEqual()
{
Assert.AreEqual(ITuple.Create(1, Tuple.Create("a")), ITuple.Create(1, Tuple.Create("a")));
Assert.AreNotEqual(ITuple.Create(1, Tuple.Create("a")), ITuple.Create(1, Tuple.Create("b")));
}我选择在静态类中隐藏具体类_ITuple的实现,因此您只能访问公共和静态构建器ITuple.Create。
问题:
Tuple包含所有Create静态方法一样,不是接口的ITuple具有静态构建器。在什么时候用I前缀命名一个非接口是很奇怪的呢?ITuple接口ICovariantTuple,但是发现它太长了,框架中没有ITuple。很明显,ITuple是协变的吗?发布于 2013-11-18 16:41:08
ISomething。您只需调用静态类Tuple,并使用不同的命名空间将其与System.Tuple区分开来。或者您可以将类称为TupleEx,尽管这并不是非常描述性的。但是最好的选择是,如果您能够为将它与System.Tuple区分开来的类型找出一个好名称。我同意CovariantTuple是相当长的,虽然我没有更好的想法。_ITuple这个名字,即使它不是公开可见的。我会把它叫做TupleImpl。(同样,如果你想出一个好名字,你也可以在这里用这个名字。)ITuples将显示与正常的Tuples相同的内容。这很可能是你想要的,但你应该意识到这一点。我认为平等或哈希码没有其他问题。System.Tuple转换为ITuple和back可能是有意义的。https://codereview.stackexchange.com/questions/35601
复制相似问题