C#表达式求值为命名空间

时间:2009-08-19 23:17:48

标签: c# expression

MSDN docs state“表达式是可以计算为单个值,对象,方法或命名空间的代码片段。”

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

编辑:修复拼写错误

4 个答案:

答案 0 :(得分:10)

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

System.String

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

  

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

     

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

不能使用它,因为,例如,方法的参数不会取消它被视为表达式。

答案 1 :(得分:3)

this page on MSDN上说:

  

但是,虽然命名空间名称是   它被归类为表达式   不评估价值因此   永远不会是任何人的最终结果   表达。你无法通过   命名空间名称到方法参数,   或者在新的表达中使用它,或者   将其分配给变量。你只能   将它用作较大的子表达式   表达。类型也是如此   (与System .. ::。Type不同   对象),方法组名称(如   与特定方法不同),和   事件添加和删除访问者。

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

答案 2 :(得分:0)

foo = System;

System计算到命名空间。

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

答案 3 :(得分:0)

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

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

然后能够在代码中使用表达式。当存在名称空间争用时,这可能很有用,例如,如果您有类似MailItem的类或在多个名称空间中通用的类。

所以你现在可以这样做:

var mailItem = new OutlookStuff.MailItem();

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