使用using声明一个匿名元组;可能吗?

时间:2018-11-29 20:57:06

标签: c#

using Coordinate = (int x, int y);

不编译。

using Coordinate = System.Tuple<int, int>;

可以编译。

由于某些原因,我更喜欢前者;能做到吗?

更新:

原因已经受到质疑和辩论,所以这里是原因:

我有一堂小课,可以使用元组。我可以写一个小的元组class Coord{int x; int y;},但决定不这样做。取而代之的是,我到处都写着(int x, int y),然后让鸭子打字发挥作用。它可以正常工作,但在某些地方会影响可读性,这可能是因为我们接受过{em> 的PascalCase而非(pare,the,sised)的阅读类型的训练。 因此我有一个想法,就像给类型Tuple<int,int>命名一样,我也可以给匿名类型(int x, int y)命名一个别名。然后,我可以使用别名或匿名类型,具体取决于我认为更具可读性的内容。
(我的真实代码比x&y复杂得多)

2 个答案:

答案 0 :(得分:3)

没有前者不能使用,因为它不是有效的C#语法。

即使using Coordinate = System.Tuple<int, int>;可以编译,我还是想为您可能要实现的目标提出一种不同的方法:

public class Coordinate
{
    public Coordinate(int x, int y)
    {
        X = x;
        Y = y;
    }

    public int X { get; set; }
    public int Y { get; set; }
}

var coordinate = new Coordinate(xVariable, yVariable);

然后您可以通过XY访问coordinate.Xcoordinate.Y变量。

正如maccettura所指出的那样,我应该提供这种方法的理由:

  1. 如果您稍后尝试在Tuple上更改坐标,将会限制您,因为创建后无法修改其项
  2. 此外,我认为您可能想向坐标添加更多功能,例如ToString()或其他方法/属性

答案 1 :(得分:1)

2点注意事项

  1. using指令需要已知的名称空间或类型
  2. 当元组声明为(int x, int y) t = ...时,您只有编译器命令,而没有键入。

如果您将变量声明为元组,编译器会生成类似这样的内容

[System.Runtime.CompilerServices.TupleElementNames(new string[] {"x", "y"})]
System.ValueTuple<int, int> myVar = ...

我们在这里谈论的是语法糖,它使元组的使用更加容易,命名项在设计时可用,而实类型在编译时生成。但是某些指令等需要已知类型。因此,您会遇到导入类型不存在的问题。

Check this article