回答
所以我試了一下,只是爲了確定。事實證明,這只是正常工作:
void F(int x) { }
int G<T, U>(int x) { return x; }
class A { }
class B { }
void Main()
{
F(G<A,B>(4));
}
但是,這產生了一些編譯錯誤:
void F(bool x, bool y) { }
void Main()
{
int G = 0, A = 1, B = 2;
F(G<A,B>(4));
}
The type or namespace name 'A' could not be found (press F4 to add a using directive or assembly reference)
The type or namespace name 'B' could not be found (are you missing a using directive or an assembly reference?)
The variable 'G' is not a generic method. If you intended an expression list, use parentheses around the < expression.
所以答案是表達F(G<A,B>(4))
被解釋爲一個通用函數調用。有許多方法可以強制編譯器將其視爲兩個參數的單個函數調用:F(G<A,B>4)
,F((G)<A,B>(4))
或F(G>A,B>(4))
,僅舉幾例。
您應該閱讀C#規範的7.6.4.2,該規範處理語法歧義並幾乎逐字討論此示例。引述:
If a sequence of tokens can be parsed (in context) as a simple-name (§7.6.2), member-access (§7.6.4), or pointer-member-access (§18.5.2) ending with a type-argument-list (§4.4.1), the token immediately following the closing
>
token is examined. If it is one of() ] } : ; , . ? == != |^
then the type-argument-list is retained as part of the simple-name, member-access or pointer-member-access and any other possible parse of the sequence of tokens is discarded.
這裏,G
是一個簡單的名稱,問題是<A,B>
是否被解釋爲一種類型的參數列表,因爲這簡單的名稱的一部分。
在>
之後有(
,所以片段G<A,B>
是方法的簡單名稱。該方法是類型參數爲A
和B
且參數爲4. F
因此是具有單個參數的方法的泛型方法。
需要注意的一件有趣的事情是,如果解析失敗,編譯器不考慮任何替代方法。正如你可以從p.s.w.g.的答案中看到的那樣,即使唯一有效的解釋是F
是一個需要兩個參數的方法,它也不會被考慮。
- 1. 全文解析挑戰
- 2. PHP - 解析XML挑戰
- 3. [R字符串解析挑戰
- 4. 解析出reCaptcha挑戰鑰匙
- 5. 前端挑戰Ruby on Rails
- 6. 挑選挑戰4:蟒蛇挑戰
- 7. 受到挑戰類型
- 8. 代碼戰挑戰
- 9. Scala:枚舉值的泛型解析器
- 10. 寫解析器是解決這個編程挑戰的正確方法嗎?
- 11. 從PHP來的Django的包( 'H32',$挑戰)和MD5( 「\ 0」 $詞$挑戰。)
- 12. Gson:解析泛型集合
- 13. 解析泛型外鍵
- 14. JavaScript挑戰 - Sherlock和數組
- 15. SSIS挑戰和小項目
- 16. Java和XA交易挑戰
- 17. jQuery Mobile和MVVM挑戰
- 18. 有趣的Oracle分析查詢挑戰
- 19. A碼的戰爭挑戰
- 20. 序言挑戰
- 21. 的 「drawStars」 挑戰
- 22. Hackerrank挑戰timout
- 23. NLP-POS挑戰
- 24. Python挑戰
- 25. Android堆挑戰
- 26. htaccess rewriterule挑戰
- 27. URLRewriting挑戰
- 28. HTML表挑戰
- 29. drawStarsStairs挑戰
- 30. 從谷歌編程挑戰賽解決「歡迎來到編程挑戰賽」 2009
第二個!,內部的G (4)會先處理然後F()的調用會執行 –
第二個當然是 –
爲什麼你認爲它是第二個? –