为什么Tuple <T1,T2,T3>不从元组<T1,T2>继承?

Wil*_*sem 23 c# tuples c#-4.0

从C#4.0开始,Tuple类可用.为什么Tuple有三个元素不是a的子类Tuple有两个元素?

这在定义First : Tuple<T1,T2> -> T1适用于任何元组的操作时非常有用,无论其他项的数量是多少.

此外,由于元组的元素是只读的,为什么Tuple<T1,T2>不协变?(例如,a ITuple<Foo,Bar>a ITuple<SuperFoo,SuperBar>as a )

Ant*_*222 11

因为对于高长度而言,设计具有不必要的深度继承是非常糟糕的.唯一合理的继承来自一些GeneralTuple,但是我无法想出任何可以被所有n元组共享和使用的代码.Neiter可以是.NET设计师.

将n元组作为(n-1)元组加上一个元素的递归定义是不自然的,因此不实用,因为在实元组中所有元素都是相等的.想象一下,你有{1, 2, 3}.有两种方法可以根据你的提议来表示它:{{1, 2}, 3}并且{1, {2, 3}},这两种方式都不能合理地被优选,这证明了表示错误,因为它除了美观和非简化的数学定义之外还需要人为的和多余的约定.

  • @CommuSoft:“*事实上,顺序在某种程度上是任意的。然而,它将使程序员能够处理顺序,因为这增加了额外的功能。*”在我看来,这种情况与元组的目的相矛盾,并需要不同的和更适合的数据结构。“*例如,在 Haskell 中,元组首先按第一个元素排序。从这个意义上说,元组的第一项比第二项具有更大的影响,等等。*”程序员可以自由地定义排序规则,因为它喜欢他,但我不认为它们应该被构建到元组的定义中。 (2认同)
  • @CommuSoft 如果您需要依赖“Tuple”继承的设计方式,那么您就做错了。 (2认同)

xmo*_*jmr 5

TL; DR因为C#语言不是MATLAB语言,不是Wolfram语言,不是Prolog语言不是F#语言.语言设计和类库设计旨在提供生产就绪,功能强大,易于使用,高效,图灵完备的通用语言(参见例如维基百科:C#设计目标).C#不是用于在原始哲学或数学意义上表达和操纵思想的语言

为什么带有3个元素的元组不是具有2个元素的元组的子类?

为什么微软的某个人决定以这样的方式编写http://referencesource.microsoft.com/#mscorlib/system/tuple.cs?问问微软的设计师.

这个"为什么"的问题没有真正的生命意义(并且不符合Stack Overflow问题格式).如果你会问"怎么样"我可以忍受它在我的代码和我,例如如何定义GeneralTuple,让我创造一些抽象的泛型函数库......那么这样的问题将有一个意识,将有一个可用的答案.

从我的角度来看,这个设计决定可能是由元组的性质和历史引起的.据我所知,它来自Linda计算模型,tuples其中基本数据结构存在于关联存储器中,称为元组空间.元组只是简单的数据结构(没有方法和行为的OOP对象),类似于现在称为数据传输对象(DTO).它总是只是一个简单的数据结构,是关联内存的一部分.要求是简单快速的读/写/传输.这就是今天内置的C#Tuples支持

为什么Tuple<T1,T2>不协变(即a Tuple<Foo,Bar>也是Tuple<SuperFoo,SuperBar>一样)?

因为通用类不是如何工作的.这个问题在Stack Overflow上也有几次解释,参见例如C#中的通用继承类型限制