更新: 看來我對於我所問的問題並不清楚(而隨着時間的推移,失去了跟蹤位),所以這裏是一個TL;博士版本:「?」類型修飾符優先與邏輯和運算符(&)vs地址運算符(&)
var test1 = a is byte & b; // compiles
var test2 = a is byte? & b; // does not compile
var test3 = a is byte? && b; // compiles
這意味着 - 我的理解 - 即?
型改性劑具有較低優先(因爲它不是一個運營商,這可能不是最好的詞)比&
運營商,但高於&&
歌劇TOR。是這樣嗎?標準中描述了哪些內容?
而原題:
雖然試圖找出答案,從喬恩斯基特的優秀博文,A Tale of two puzzles第二個謎,我面臨着一個問題:
unsafe private void Test<T>(T a, bool b)
{
var test1 = a is byte? & b; // does not compile
var test2 = a is byte? && b; // compiles
var test3 = a is byte ? & b : & b; // compiles
}
我在這裏使用unsafe
上下文作爲我的實際目標需要它(例如:第三行),但不需要重現我提出的問題。 (然而,它可能有一個影響,因爲它引入了地址的運營商作爲&
符號替代)
第一行不會編譯(別人做的),它提供了以下錯誤信息:
Syntax error, ':' expected
這意味着,在這種情況下,編譯器看到線
var test1 = (a is byte) ? &b [: missing part that it complains about];
當在第二線它認爲它爲:
var test2 = (a is byte?) && (b);
我檢查了運算符的優先級(here),並且順序(從最高到最低)如下:&, &&, ?:
,所以這並不能解釋爲什麼第一行不能編譯,而第二行卻不能編譯(或者至少不是我 - 也許這是我錯了...)編輯:我明白爲什麼第二次編譯,所以請不要專注於你的答案。
我的下一個直覺是,不知何故優先(如果有這樣的事情)爲?
類型修飾符是介於這兩個(或實際上爲三個)運營商(&
和&&
)之間。它可以這樣嗎?如果沒有人可以解釋我正在經歷的確切行爲? ?
類型修飾符的評估順序是否清晰地在標準的某個位置進行了描述?
編輯:我也意識到有一個一元的地址 - 操作符(實際上這是我試圖用於解決方案的技巧...),這在這裏扮演一個角色,但我的問題仍然存在一樣。
同樣unsafe
背景下對這些興高采烈地編譯:
var test1 = true & b;
var test2 = true && b;
// or
var test1 = a is byte & b;
var test2 = a is byte && b;
所以,我認爲,必須進行相關的?
改性劑/運營商,而不是僅僅以運營商地址服用優先級(另有兩個test1
行不會編譯)。
PS:我知道,我可以加括號我的代碼,所以它會編譯,但我想避免這種情況:
var test = (a is byte?) & b; // compiles
更新: 我羅斯林一點,我嘗試認爲它可能是附加的AST的各種報表是一個好主意:
var test1 = a is byte & b;
var test2 = a is byte? & b;
var test3 = a is byte? && b;
我想強調,我不尋找鏈接的文章中對原問題的解決方案(當然我要找一個,但我請你不要在這裏給出答案,因爲我希望自己找到答案。) 另外,如果我在完全錯誤的tra上,請不要評論在找到解決方案時,我只提到了爲我的具體問題提供一些背景的難題,併爲編寫這樣的代碼提供了一個足夠好的藉口。
不錯的問題。現在我放棄了 - 語言規範中的「語法歧義」部分。不包括這種情況。你可能會覺得有趣的一件事是,互聯網似乎在思考這個問題[大約8年](http://www.progtown.com/topic15933-grammar-ambiguities-in-c-20.html); ) – BartoszKP
這是猜測,但我懷疑問題在於解析器只展望幾個標記,而當它解析'?'時,它只能看到'&b'或更少。 'a是字節? &b'不明確,它可能意味着可爲空類型或三元運算符。如果它能夠向前看並看到分號,那麼歧義將被解決。這可能是由於[lookahead]有限(http://en.wikipedia.org/wiki/Parsing#Lookahead),而不是本身的運算符優先級。 –
@KendallFrey這顯然不是「運算符優先級本身」,因爲'byte?'中的'?'是一個類型修飾符,而不是運算符。我認爲你是正確的,問題要早得多,在詞法層面更多。 – BartoszKP