如何为列表中的命名元组正确分配名称

时间:2019-06-20 16:48:49

标签: c# tuples namedtuple

我有以下代码,它似乎工作正常,但是当我检查列表中的元组时,它们的名称分别为Item1,Item2,Item3,而不是我为其分配的名称。我究竟做错了什么? (代码引用了System.ValueTuple。)

谢谢您的帮助。

var listContent = new List<(string date, double value, DateTime datetime)>();

// Read the file just created and put values in list of tuples
using (var reader = new StreamReader(rawFileName))
{
   while (!reader.EndOfStream)
   {
      var line = reader.ReadLine();
      var values = line.Split(',');
      listContent.Add((date: values[0],
         value: Convert.ToDouble(values[2]),
         datetime: DateTime.ParseExact(values[0], "yyyy-MM-dd", null)));
    }
}

如果在上述代码之后放置一个断点,则可以在“即时窗口”中执行以下操作,这更加令人困惑:

listContent[0]
("2017-01-01", 17.193, {01/01/2017 00:00:00})
    date: "2017-01-01"
    value: 17.193
    datetime: {01/01/2017 00:00:00}
    Raw View: ("2017-01-01", 17.193, {01/01/2017 00:00:00})
listContent[0].Item1
null
listContent[0].date
null
listContent[0].dummy
error CS1061: '(string date, double value, DateTime datetime)' does not contain a definition for 'dummy' and no accessible extension method 'dummy' accepting a first argument of type '(string date, double value, DateTime datetime)' could be found (are you missing a using directive or an assembly reference?)

[更新]

我超级简化了代码:

var listContent = new List<(string str1, string str2)>();
for (var n = 1; n < 100; n++)
{
   var tpl = (str1: "hello" + n.ToString(), str2: "world" + n.ToString());
   listContent.Add(tpl);
}
var z = listContent[0].str1;

并查看即时窗口给我带来的好处:

z
"hello1"
listContent[0].str1
null

所以我不会发疯:元组分配正确,但是出于某些奇怪的原因,立即窗口仍然为listContent [0] .str1赋予了我null

1 个答案:

答案 0 :(得分:2)

元组元素名称不是该类型的一部分。编译器将名称转换为关联的ItemN属性。

除了局部变量(不能将属性应用到它们)外,名称在[TupleElementNames]属性中传达。例如,如果您将listContents声明为字段,则它将具有以下属性:

[TupleElementNames(new string[] { "date", "value", "datetime" })]

当您将鼠标悬停在listContents上时,调试器仅看到列表实例和其中的元组实例。给定实例,元组元素名称不可用。您将需要随附的PropertyInfoFieldInfoParameterInfo,以便获得传达名称的TupleElementNamesAttribute。但是,如果将其设置为字段,则调试器仍仅查看实例。

我无法在“即时”窗口中解释该行为,并且“监视”窗口似乎有相同的问题。看起来您在Visual Studio中发现了一个错误。