"Neden olmasın" sorularını geri itiyorum çünkü ilk olarak, cevaplar neredeyse hiçbir zaman tatmin edici değil - "özellik istediğiniz gibi değil çünkü şartname ne söylemesini istediğinizi söylemiyor" cevabını zaten almışsınızdır. Sanırım özellikle tatmin edici bir cevap değildi. İkincisi, tasarım ekibinin dünyanın neden istediğiniz gibi olmadığını haklı göstermesi gerekmez; özellikler ücretsiz olarak mevcut değildir ve daha sonra dil dışında tasarlanır; bunun yerine, özelliklerin önce gerekçelendirilmesi ve ardından tasarlanması gerekir.
Öyleyse "neden olmasın" sorunuzu biraz daha netleştirmeye çalışalım. Mevcut özellik, "(a) eşitlerin sağ tarafında bir başlatmada veya (b) dizi tipindeki bir nesne yapısının sağında bir dizi başlatıcı kullanılabilir." Önerilen özellik şudur: "bir dizi başlatıcı da bir ifade olarak kullanılabilir". Soru, "Eric önerilen özellik hakkında ne eleştirirdi?"
Yapacağım ilk eleştiri, ifadenin türünün net olmadığıdır. Bir değişken başlatıcıda değişkenin türüne sahipsiniz ve bir nesne oluşturma ifadesinde nesnenin türüne sahipsiniz; bunların her ikisinden de inşa edilen dizinin türünü çıkarabiliriz. Herhangi bir ipucu olmadan, hangi tür sonuca varmalıyız?
C # 1.0'da, bu özellik eklendiğinde, dilde genel toplam sıfır tipi çıkarımlar yapıldı. C # 'ın ilk günlerinde bir tasarım ilkesi "sürpriz yok" idi ve derleyici "çok akıllı" değildi. Geliştirici, bir ifadenin belirli bir türde olmasını isterse, bu tür ifadede bir şekilde açık olmalıdır. Dediğinde
new double[] { 1, 2, 3.4 }
hangi türün amaçlandığı oldukça açık. benzer şekilde
new Animal[] { cat, dog, null }
Önerilen özellik bu prensibi ihlal ediyor. İfadenin bir türü olmalıdır, ancak hiçbir şekilde argümanın türünün ne olduğu açık değildir.
M({cat, dog, null})
Dahası: MBiri bir dizi, Animaldiğeri bir dizi alan iki aşırı yüklememiz olduğunu varsayalım IPet. Hangi aşırı yük Muygulanabilir? Dönüşümlerden biri diğerinden daha mı iyi? Elemanların türleri Catve Dog; Orada görünmeyen bir türü çıkarmak mantıklı mı? Bunların hepsi tasarım ekibi tarafından dikkate alınması gereken sorulardır ve bunlar hiçbir şekilde açık cevapları olmayan sorulardır. Önerilen özellik bizi oldukça kısa bir sırayla derin sulara götürür.
Şimdi, C # 3.0 bu sorunu çözüyor çünkü C # 3.0, derleyicinin geliştirici adına türler belirlediği çok sayıda özellik ekledi. "Sürpriz yok" ve "basit kurallar" hakkındaki önceki ilkeler, LINQ'nun çalışması için gereken diğer tasarım ilkeleriyle çelişiyordu. Önerdiğiniz özellik C # 3.0'a eklenmeli mi?
Olabilirdi. Gerçekte C # 3.0'da eklenen özellik şuydu:
new[] { x, y, z }
algoritmayı kullanarak dizinin türünü ortaya çıkarır: türleri olan öğelerin ifadelerini alın, bu türlerden hangisinin diğer tüm ifadelerin dönüştürülebileceği en genel benzersiz tür olduğunu belirleyin ve böyle bir tür varsa, bunu seçin. Aksi takdirde bir hata oluşturur,
Bu özellik, new[]isteğe bağlı hale getirmek için daha da gevşetilebilirdi . Bu yapılmadı.
Şimdi, C # 3.0 zaman diliminde benden önerilen özelliği eleştirmemi isteseydiniz, (1) C # 3.0 derleyicisinin zaten tüm sürüm için çizelgeyi kayma tehlikesiyle karşı karşıya olduğunu belirtmiştim, bu yüzden daha fazlasını eklemeyelim kullanıcıyı altı tuş vuruşundan kurtaran tamamen gereksiz bir özellik için tasarım, uygulama ve test yükü ve (2) C # 3.0 ayrıca koleksiyon başlatıcıları ekledi:
new List<int>() { 10, 20, 30 }
neden {10, 20, 30}otomatik olarak bir dizi olmalı ? Neden a olmamalı List<int>? Veya başka türlerden herhangi biri? Neden dizilere yönelik önyargı? Unutmayın, diziler için sözdizimini saklamayı seçtiğimizde, sonsuza dek ona bağlı kalacağız . Asla başka bir şey olmayabilir , bu nedenle önerilen özellik sadece gereksiz olmakla kalmaz, aynı zamanda makul görünen gelecekteki olası özellikleri de engeller.
Özetle: Önerilen özellik, C # 1.0'ın bazı tasarım ilkelerini doğrudan ihlal etti. C # 3.0'a gereksiz yükten başka bir şey eklemiyor. C # 3.0'dan bu yana dilin tüm sürümlerinde, önerilen özelliğin diğer birçok değerli özelliğe göre zaman, çaba ve para harcamayı önerecek iyi bir argümanı yoktur.
Dolayısıyla böyle bir özellik yok.