[英]How do I correctly assign names to a named tuple in a list
我有下面的代碼,它似乎工作正常,但是當我檢查列表中的元組時,它們被命名為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提供了空值?
元組元素名稱不是該類型的一部分。 編譯器將名稱轉換為關聯的ItemN
屬性。
除了局部變量(不能將屬性應用到它們)外,這些名稱在[TupleElementNames]
屬性中傳遞。 例如,如果要將listContents
聲明為字段,則會將以下屬性應用於該字段:
[TupleElementNames(new string[] { "date", "value", "datetime" })]
當您將鼠標懸停在listContents
上時,調試器僅看到列表實例和其中的元組實例。 給定實例,元組元素名稱不可用。 您將需要附帶的PropertyInfo
, FieldInfo
或ParameterInfo
以便獲得傳達名稱的TupleElementNamesAttribute
。 但是,如果將其設置為字段,則調試器仍僅查看實例。
我無法在“立即”窗口中解釋該行為,並且“監視”窗口似乎有相同的問題。 看起來您在Visual Studio中發現了一個錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.