Derin anlayışlar takdir edildi.
Elimden geleni yapacağım.
Diğer cevaplar belirttiği gibi, burada ne oluyor derleyici bir o algıladığını olduğu ifade bir şekilde kullanılıyor açıklamada . Birçok dilde - C, JavaScript ve diğerleri - bir ifadeyi ifade olarak kullanmak tamamen yasaldır. 2 + 2;
etkisi olmayan bir ifade olmasına rağmen bu dillerde yasaldır. Bazı ifadeler yalnızca değerleri için yararlıdır, bazı ifadeler yalnızca yan etkileri (faydalı bir geri dönüş yöntemine çağrı gibi) için yararlıdır ve bazı ifadeler maalesef her ikisi için de yararlıdır. (Artış gibi.)
Nokta: sadece ifadelerden oluşan ifadeler, bu ifadelerin tipik olarak yan etkileri için değerlerinden daha yararlı olduğu düşünülmedikçe neredeyse kesinlikle hatalardır . C # tasarımcıları, genellikle yan etkileri olarak düşünülen ifadelere izin verirken, tipik olarak değerleri için yararlı olduğu düşünülenlere izin vermeyerek orta bir zemin bulmak istiyorlardı. C # 1.0'da tanımladıkları ifade kümesi, artışlar, azalmalar, yöntem çağrıları, ödevler ve biraz tartışmalı olarak yapıcı çağrılarıydı.
ASIDE: Normalde bir nesne yapısının, yapının yan etkisi için değil, ürettiği değer için kullanıldığı düşünülmektedir; benim görüşüme göre izin vermek new Foo();
biraz yanlıştır. Özellikle, bir güvenlik hatasına neden olan gerçek kodda bu kalıbı gördüm:
catch(FooException ex) { new BarException(ex); }
Kod karmaşıksa bu kusuru tespit etmek şaşırtıcı derecede zor olabilir.
Derleyici, bu nedenle, listede olmayan ifadelerden oluşan tüm ifadeleri algılamaya çalışır. Özellikle, parantez içindeki ifadeler sadece - parantez içindeki ifadeler olarak tanımlanır. "İfade ifadesi olarak izin verilir" listesinde yer almazlar, bu nedenle izin verilmez.
Bütün bunlar C # dilinin tasarım prensibine hizmet ediyor. Eğer yazdıysanız (x++);
muhtemelen yanlış bir şey yapıyordunuz . Bu muhtemelen bir yazım hatası M(x++);
ya da adil bir şeydir. C # derleyicisi ekibinin tutum hatırla değil " biz bu işi yapmak için bazı yollar bulabilir? " C # derleyicisi ekibinin tutum "olduğu bir olasılıkla hata gibi makul kod görünüyor, izin verirsen geliştiricisi bilgilendirmek ". C # geliştiricileri bu tutumu sever.
Şimdi, bütün bu dedi, aslında C # şartname birkaç tuhaf durumlar vardır mu ima veya parantez izin verilmeyen ancak C # derleyicisi zaten onları tanır edilir düpedüz devlet. Hemen hemen tüm bu durumlarda, belirtilen davranış ve izin verilen davranış arasındaki küçük tutarsızlık tamamen zararsızdır, bu nedenle derleyici yazarları bu küçük hataları asla düzeltmemiştir. Bunları burada okuyabilirsiniz:
Return myVar ve return (myVar) arasında fark var mı?