有什么理由我们不能在元组周围有一些语法糖
本文关键字:语法 周围 什么 理由 我们 不能 元组 | 更新日期: 2023-09-27 18:30:45
我希望在 C# 中看到的是围绕元组的更好语法,例如。
var rgb = (1.0f, 1.0f, 1.0f);
// Inferred to be Tuple<float, float, float>
// Translated to var rgb = Tuple.Create(1.0f, 1.0f, 1.0f)
和
var x, y, z = rgb;
// Translated to:
// float x = rgb.Item1;
// float y = rgb.Item2;
// float z = rgb.Item3;
C# 语言中是否有任何内容禁止这样做,或者使其难以/不切实际地实现?也许还有其他语言功能会与此直接冲突?
请注意,我并不是在问这是否在微软的雷达上,或者即使它与他们对 C# 的愿景一致,只是在理论上是否有任何明显的阻碍因素。
编辑以下是来自其他 CLI 语言的一些示例
// Nemerle - will use a tuple type from a language specific runtime library
def colour = (0.5f, 0.5f, 1.0f);
def (r, g, b) = colour;
// F# - Will use either a library type or `System.Tuple` depending on the framework version.
let colour = (0.5f, 0.5f, 1.0f)
let (r, g, b) = colour
// Boo - uses CLI array
def colour = (0.5, 0.5, 1.0)
def r, g, b = colour
// Cobra - uses CLI array
var colour = (0.5, 0.5, 1.0)
var r, g, b = colour
虽然使用数组似乎是一个很好的折衷方案,但在混合类型时它会受到限制,例如。 let a, b = (1, "one")
F# 或 Nemerle 会给我们一个Tuple<int, string>
.在Boo或Cobra中,这将给我们一个object[]
。
编辑2C# 7 中添加了对元组的语言支持 - https://www.kenneth-truyers.net/2016/01/20/new-features-in-c-sharp-7/
第二个是不可能的,因为它已经意味着别的东西了:
float x, y, z = 0.1f;
这声明了三个变量x
、y
和z
,z
被初始化为0.1
。与问题中提出的语法的差异充其量是微妙的。
这显然是一个设计问题,因为在您的情况下,您只将值分配给最后一个变量,而其他两个变量则假定指定类型的默认值。
var x, y, z = rgb;
因此,无论rgb
是什么,只有 z 被分配给它。如果你改变这种行为,就完全不清楚那条线上发生了什么:
- 赋值给所有变量
- 仅分配给最后一个
如果您在这里没有做出明确的决定,则会导致基于赋值运算符右侧的类型的不同行为:在一种情况下,它将是声明和赋值执行默认值,在另一种情况下,声明和赋值为特定值。
第二种语法已被Tigran和Hilgarth证明是不可行的。
让我们看第一个语法:
var rgb = (1.0f, 1.0f, 1.0f);
如果您不想使用 Tuple
类,而是要使用 MyTuple
类(这也许具有IEnumerable<object>
的优点,非常有用!显然,语法无济于事。你必须把MyTuple
类放在某个地方......
MyTuple<float, float, float> rgb = (1.0f, 1.0f, 1.0f);
或
var rgb = new MyTuple<float, float, float>(1.0f, 1.0f, 1.0f);
现在,这种新的速记语法的优势不再存在,因为您必须在某个地方放置MyTuple<float, float, float>
。
请注意,没有任何单个集合初始值设定项可以简单地"自动发现"所有内容。
var myVar = new List<int> { 1, 2, 3 };
在这里,我们谈论List<int>
的事实很清楚:-)
即使是数组初始值设定项,有点"特殊",也不是隐式的......
int[] myVar = { 1, 2, 3 };
var myVar = new[] { 1, 2, 3 };
var myVar = new int[] { 1, 2, 3 };
都是有效的,但是我们谈论数组的事实总是明确的(总有一个[]
)
var myVar = { 1, 2, 3 };
无效:-)数组具有作为基元构造的"优势"(IL 语言直接支持数组,而所有其他集合都构建在其他 .NET 库和/或数组之上)