MSDN 文档声明“表达式是可以评估为单个值、对象、方法或命名空间的代码片段。”
有人可以解释一下表达式评估为命名空间意味着什么 - 那怎么可能?
编辑:修正错字
这就是语法的定义方式。看着:
System.String
是一个包含点运算符的表达式,该运算符对几个不同的表达式进行操作。System
单独被认为是一种表达。表达式可以像单个标识符或文字一样简单(提示:它是递归定义的。)
表达式(C# 3.5 规范第 §7.1 节:表达式分类)
表达式被归类为以下之一:
...
命名空间。具有此分类的表达式只能显示为成员访问的左侧(第 7.5.4 节)。在任何其他上下文中,归类为命名空间的表达式会导致编译时错误。
例如,不能将其用作方法的参数并不能取消将其视为表达式的资格。
在MSDN 的这个页面上它说:
但是,尽管命名空间名称被归类为表达式,但它不会计算为值,因此永远不会是任何表达式的最终结果。您不能将命名空间名称传递给方法参数,或在新表达式中使用它,或将其分配给变量。您只能将其用作较大表达式中的子表达式。对于类型(与 System..::.Type 对象不同)、方法组名称(与特定方法不同)以及事件添加和删除访问器也是如此。
因此,实际上,您无法将名称空间作为表达式真正做任何事情,它始终以相同的方式工作,您无法影响它的任何动态,但对于解析器来说,名称空间必须是某种东西:)。它是一个表达式的原因是由于在编译过程中用于解析代码的 C# 语言的语法。它由语句、表达式、运算符等组成......所以在 System.Guid yourGuid = System.Guid.NewGuid() 的情况下,System 部分将是一个包含命名空间的表达式,. 将是一个运算符,而 Guid 将是 C# 解析器的一种类型。
foo = System;
System
评估为命名空间。
(当然,这不会编译,因为您不能将命名空间分配给变量,但您明白了。)
您可以使用这样的表达式:
using OutlookStuff = Microsoft.Office.Outlook.This.Is.Really.Long.Isnt.It;
然后可以稍后在代码中使用该表达式。当存在名称空间争用时,这可能很有用,例如您有像 MailItem 这样的类或跨多个名称空间通用的东西。
所以你现在可以这样做:
var mailItem = new OutlookStuff.MailItem();
编辑我认为 Mehrdad 的答案是更正确的答案,但我认为这是值得注意的。