为什么字符串数组的 "Count" Intellisensed 属性 会变成 "Length"?

Why does a String Array's "Count" Intellisensed property morph into "Length"?

我有这段代码可以查看从 SQL 服务器存储过程返回了多少不同的 fields/columns(dtPriceComplianceResults 是一个数据表,已填充了 SP 的结果) :

string[] columnNames = dtPriceComplianceResults.Columns.Cast<DataColumn>()
                .Select(x => x.ColumnName)
                .ToArray();

当我在下面直接添加这段代码时:

if (columnNames.

...Intellisense 给了我一个“Count”选项;但是,当我 select Enter 键接受它时,它会将其变形为 "Length" - 它不会让我选择 "Count" 即使它在可用属性列表中访问.

注意: "morphed" 我的意思是当我点击 "Enter" 时附加到 "columnNames." 的文本是 "Length"不是 "Count",所以它最终是 "columnNames.Length"

它确实以这种方式编译(使用 "Length"),而使用 "Count" 则不会(“Operator '>' cannot be applied to operands of type 'method group' 和 'int'").

我想这是一件好事,但如果 "Count" 不会真的 select 可行,为什么它会出现在列表中?

Count() 是一种方法,而不是 属性。这就是您收到 "cannot be applied to operands of type 'method group' ..." 错误的原因。

它是 IEnumerable 的扩展方法,实现将(最终)return Array.Length

您可以使用它,但它的效率低于简单(和直接)Length

Intellisense 或 Resharper 正在做正确的事情。

It's a ReSharper 10 "typo protection" option:

Correcting Length/Count mistyping

ReSharper prevents you from stumbling over mistyped Length/Count properties of arrays/collections. As soon as you erroneously start typing the Count property for a usage of an array, ReSharper will allow you to pick it from the completion list and replace with the Length property, which you probably meant to type.

您可以在成员信息弹出窗口(IntelliSense 下拉菜单右侧的工具提示)中看到它将被替换为 System.Array.Length

如果您想要 Count() 扩展方法,则必须 select Count 选项前面加上粉红色带箭头的扩展方法图标,而不是顶部的灰色自动完成图标: