如果您尝试在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/