我們看一下之前例子中的代碼:<li>@p.Name ([email protected])</li>是如何解析的。 當遇到"<li>"字符序列的時候,解析器知道正在解析一個以"</li>"為結束標志的標記。然後標記解析器在解析到結束標志之前發現了一個"@"字符,就像"@foreach"一樣,再次切換到代碼解析器。這時和之前的解析有些不同,C#代碼解析器發現第一個標識符"p"時,它會檢查這個標識符是不是C#的關鍵字;當然"p"並不是C#關鍵字,所以代碼解析器進入"隱式表達式"模式。解析隱式表達式的算法看起來是這樣的:
首先讀取一個標識符,
下一個字符是"("或者"["?
是則讀到匹配的")"或者"]",然後跳到2
不是則繼續3
下一個字符是"."?
是則繼續4
不是則結束表達式
"."後面的字符是合法的C#標識符的開始?
是則讀取"."並跳到1
不是則不讀"."並結束表達式
總體來說就是:一個隱式表達式就是一個標識符,之後可以跟任意數量的方法調用("()")、索引表達式("[]")及成員訪問表達式(".")。但是,除了在"()"或者"[]"裡面,是不允許空格存在的。例如,下面是一些合法的Razor隱式表達式:
@p.Name
@p.Name.ToString()
@p.Name.ToString()[6 - 2]
@p.Name.Replace("ASPX", "Razor")[i++]