c# - 为什么 Tuple<T1...TRest> 中的 TRest 不受约束?

标签 c# .net constraints tuples

在一个元组中,如果您有超过 7 个项目,您可以提供第 8 个项目,它是另一个元组并定义最多 7 个项目,然后另一个元组作为第 8 个,并在该行的下方。但是编译时对第8项没有约束。例如,这是编译器的合法代码:

var tuple = new Tuple<int, int, int, int, int, int, int, double>
                (1, 1, 1, 1, 1, 1, 1, 1d);

尽管智能感知文档说 TRest 必须是元组。您在编写或构建代码时不会遇到任何错误,直到运行时才会以 ArgumentException 的形式出现。

您可以在几分钟内大致实现一个元组,完成元组约束的第 8 项。我只是想知道为什么它被排除在当前实现之外?这可能是一个前向兼容性问题,他们可以使用假设的 C# 5 添加更多元素吗?

粗略实现的简短版本

interface IMyTuple { }

class MyTuple<T1> : IMyTuple
{
    public T1 Item1 { get; private set; }
    public MyTuple(T1 item1) { Item1 = item1; }
}

class MyTuple<T1, T2> : MyTuple<T1>
{
    public T2 Item2 { get; private set; }
    public MyTuple(T1 item1, T2 item2) : base(item1) { Item2 = item2; }
}

class MyTuple<T1, T2, TRest> : MyTuple<T1, T2> where TRest : IMyTuple
{
    public TRest Rest { get; private set; }
    public MyTuple(T1 item1, T2 item2, TRest rest)
        : base(item1, item2)
    {
        Rest = rest;
    }
}

...

var mytuple = new MyTuple<int, int, MyTuple<int>>
                 (1, 1, new MyTuple<int>(1)); // legal
var mytuple2 = new MyTuple<int, int, int>(1, 2, 3); // illegal at compile time

最佳答案

这是类型系统的限制。 ITuple 是一个内部接口(interface)。如果它是一个通用约束,它就需要公开,这样每个人都可以实现自己的 ITuple,这与元组没有任何关系。将它限制在内部让 BCL 团队保证它实际上是某种元组,但会导致 TRest 的编译时安全性比它可能的要差一些。

关于c# - 为什么 Tuple<T1...TRest> 中的 TRest 不受约束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2994163/

相关文章:

c# - 使用 ReSharper 在 C# 中的大括号后缩进

c# - 如何获取可选参数的默认值?

c# - Microsoft.Expression.Interactions 版本 4.0.0.0 运行时版本 v4.0.30319 在哪里下载?

在 GCC 中调用程序集?

MySQL:无法删除或更新父行:外键约束失败

c# - 为什么这个通用约束在似乎有循环引用时编译

c# - 如何声明类的 List 属性的获取和设置访问器

c# - 通过WMI C#Active Directory

c# - foreach 是纯粹的 “syntactic sugar” 吗?

c# - 如何在 C# 中并行运行任务并选择满足给定条件的第一个结果?