3

MSDN 文档声明“表达式是可以评估为单个值、对象、方法或命名空间的代码片段。”

有人可以解释一下表达式评估为命名空间意味着什么 - 那怎么可能?

编辑:修正错字

4

4 回答 4

10

这就是语法的定义方式。看着:

System.String

是一个包含点运算符的表达式,该运算符对几个不同的表达式进行操作。System单独被认为是一种表达。表达式可以像单个标识符或文字一样简单(提示:它是递归定义的。)

表达式(C# 3.5 规范第 §7.1 节:表达式分类)

表达式被归类为以下之一:
...
命名空间。具有此分类的表达式只能显示为成员访问的左侧(第 7.5.4 节)。在任何其他上下文中,归类为命名空间的表达式会导致编译时错误。

例如,不能将其用作方法的参数并不能取消将其视为表达式的资格。

于 2009-08-19T23:21:46.293 回答
3

MSDN 的这个页面上它说:

但是,尽管命名空间名称被归类为表达式,但它不会计算为值,因此永远不会是任何表达式的最终结果。您不能将命名空间名称传递给方法参数,或在新表达式中使用它,或将其分配给变量。您只能将其用作较大表达式中的子表达式。对于类型(与 System..::.Type 对象不同)、方法组名称(与特定方法不同)以及事件添加和删除访问器也是如此。

因此,实际上,您无法将名称空间作为表达式真正做任何事情,它始终以相同的方式工作,您无法影响它的任何动态,但对于解析器来说,名称空间必须是某种东西:)。它是一个表达式的原因是由于在编译过程中用于解析代码的 C# 语言的语法。它由语句、表达式、运算符等组成......所以在 System.Guid yourGuid = System.Guid.NewGuid() 的情况下,System 部分将是一个包含命名空间的表达式,. 将是一个运算符,而 Guid 将是 C# 解析器的一种类型。

于 2009-08-19T23:30:25.823 回答
0
foo = System;

System评估为命名空间。

(当然,这不会编译,因为您不能将命名空间分配给变量,但您明白了。)

于 2009-08-19T23:21:10.600 回答
0

您可以使用这样的表达式:

using OutlookStuff = Microsoft.Office.Outlook.This.Is.Really.Long.Isnt.It;

然后可以稍后在代码中使用该表达式。当存在名称空间争用时,这可能很有用,例如您有像 MailItem 这样的类或跨多个名称空间通用的东西。

所以你现在可以这样做:

var mailItem = new OutlookStuff.MailItem();

编辑我认为 Mehrdad 的答案是更正确的答案,但我认为这是值得注意的。

于 2009-08-19T23:24:06.333 回答