vb.net - 为什么我不能在VB中投影ToString()?

标签 vb.net linq

如果您尝试在Visual Basic .NET中编译下面的查询,它将失败。

From x In {1, 2} Select x.ToString()

编译器给出的错误是:

Range variable name cannot match the name of a member of the 'Object' class.



但是,等效的C#查询没有错:
from x in new[]{1, 2} select x.ToString()

采用格式的ToString重载不会发生这种情况(它是Int32的成员,而不是Object)。只要Object的其他成员不带参数,它就会发生:使用GetType和GetHashCode会失败;与Equals(object)一起编译。

为什么要设置此限制,我可以使用哪些替代方法?

最佳答案

这就是我的理解方式。考虑以下代码:

Dim q = From x In {"Bob", "Larry"}
        Select x.Length
        Select Length * 2

在上面的查询中,VB编译器根据表达式Length为您自动“猜测”了x.Length变量的名称。现在,您确实没有要求这个;无论您是否喜欢,它只是提供的功能。但是现在考虑一下:
Dim q = From x In {"Bob", "Larry"}
        Select (x.Length)
        Select Length * 2

上面的代码不能编译,因为第一个Select子句中的表达式不像第一种情况那样简单(信不信由你);括号使问题复杂到足以使编译器不选择名称Length;相反,它将生成一个无法从代码中使用的名称。

因此ToString()基本上发生的是,此表达式很简单,编译器可以使用它生成变量名,如果查询被扩展以使用此变量,则可以使用该表达式,例如:
Dim q = From x In { 1, 2 }
        Select x.ToString()
        Select ToString.Length

但是,ToString不是变量的合法名称,因为它是System.Object的成员(为什么我不能在LINQ查询中使用变量,而对于标准局部变量却是如此)。

关于vb.net - 为什么我不能在VB中投影ToString()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4646724/

相关文章:

C# - 使用谓词选择属性

c# - 根据 Date 对表进行排序,在 mvc 4 中使用 Linq 查询

c# - 在Linq查询中选择不重复

c# - 使用 linq 实例化包含其他对象列表的对象,其中查询条件位于内部列表上

c# - 如何在 linq 查询中传递表达式列表

javascript - vb.net整数除法

c# - 计算 2 个列表中存在的项目

vb.net - 获取当前目录并在 vbscript 中运行文件?

vb.net - 怎么说 GeckoFX 使用旧的缓存文件而不是重新加载它们?

vb.net - 是否有比 DotNetZip 或 LZMA 更好的字符串压缩库?