我有以下代码,它似乎工作正常,但是当我检查列表中的元组时,它们的名称分别为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
答案 0 :(得分:2)
元组元素名称不是该类型的一部分。编译器将名称转换为关联的ItemN
属性。
除了局部变量(不能将属性应用到它们)外,名称在[TupleElementNames]
属性中传达。例如,如果您将listContents
声明为字段,则它将具有以下属性:
[TupleElementNames(new string[] { "date", "value", "datetime" })]
当您将鼠标悬停在listContents
上时,调试器仅看到列表实例和其中的元组实例。给定实例,元组元素名称不可用。您将需要随附的PropertyInfo
,FieldInfo
或ParameterInfo
,以便获得传达名称的TupleElementNamesAttribute
。但是,如果将其设置为字段,则调试器仍仅查看实例。
我无法在“即时”窗口中解释该行为,并且“监视”窗口似乎有相同的问题。看起来您在Visual Studio中发现了一个错误。