.NET中仅修改大小写重命名DataColumn的异常行为问询
DataColumn重命名时的异常行为(疑似Bug)
复现步骤
- 获取DataTable中的一个DataColumn
- 仅修改其大小写进行重命名
- 再次将其重命名为其他名称
- 此时该列可通过旧名称与新名称同时访问
- 若将其重命名回旧名称,会触发
DuplicateNameException
问题根源推测
该问题似乎与DataColumnCollection的内部字典未在仅修改大小写重命名时更新有关:
- 初始状态下,内部字典
_columnFromName包含键为原列名的条目 - 仅修改列名大小写时,字典未同步更新,仍保留原键
- 再次重命名为新名称时,字典会添加新键,但因找不到大小写修改后的列名键,无法注销该名称,最终字典中同时存在原键和新键
代码示例
DataTable table = new DataTable(); table.Columns.Add("foo", typeof(string)); // DataTable包含名为"foo"的单列 // 内部字典_columnFromName包含键为"foo"的条目 table.Columns["foo"].ColumnName = "FOO"; // DataTable现在包含名为"FOO"的单列 // 内部字典_columnFromName未更新,键仍为"foo" table.Columns["FOO"].ColumnName = "bar"; // DataTable现在包含名为"bar"的单列 // DataColumnCollection注册了新列名"bar",但因字典中无"FOO"键,无法注销该名称 // 因此字典_columnFromName现在包含"foo"和"bar"两个键条目 // 实际上,该列仍可通过旧名称访问... Console.WriteLine(table.Columns["foo"]); // ...当然也可通过新名称"bar"访问 Console.WriteLine(table.Columns["bar"]); // 此时重命名回旧名称会触发DuplicateNameException,因旧字典键仍存在 table.Columns["bar"].ColumnName = "foo";
该问题在.NET Framework 4.7.2及.NET 7中均存在。
疑问
- 是否有其他人遇到过该行为?
- 这是预期设计吗?
- 微软是否已知晓该问题?
内容的提问来源于stack exchange,提问作者ColdSir
相关产品推荐
相关产品推荐

