Mantıksal olarak çalışması gerekirken, ne yazık ki bunu yapmaz. CLR, kurucunuzu hala parametre tabanlı bir kurucu olarak görür.
Unutmayın, C# isteğe bağlı parametreleri desteklerken, derleme zamanında derleyici düzeyinde yapılır. Altta yatan tür sadece tek bir parametre alan bir kurucu içerir. Bildiğim kadarıyla CLR ile ilgili olarak, "varsayılan parametreleri" aynen böyle nitelikler dönüştürülür:
public Widget(([Optional, DefaultParameterValue("foo")] string name) { // ...
CLR çok dilli bir çalışma zamanı olduğunu. Jenerikler, tüm diller için CLR seviyesinde çalışmak üzere hazırlanmıştır, bu yüzden kısıtlamalar, varsayılan parametreler olmayan dillerde de doğru olmalıdır. Diller, OptionalAttribute veya DefaultParameterValueAttribute öğelerini anlamak için gerekli değildir, bu nedenle tüm diller için düzgün şekilde çalışamaz, dolayısıyla izin verilmez.
Düzenleme:
yorumunuza yanıt olarak
:
Ne C# derleyicisi CLR
karşılamak için gerekli kodu üretemez neden anlamıyorum
Teorik olarak, C# derleyici ekibi, özniteliklerle işaretlenmiş bir yapıcı yerine, dilin iki ayrı kurucu oluşturmasını sağlayabilir. Bu, potansiyel olarak, birçok kurucuya patlayabilir, çünkü adlandırılmış parametreler, özellikle birden fazla argüman mevcut olduğunda, pek çok olası "kurucu" (veya metot metodları) kombinasyonları için yetenekler yaratır. Ben şahsen onlar değil, çünkü üretilen API'lar yöntem ve yapıcıların bir bolluğu nedeniyle karışıklık neden olacağından dolayı sevindim, bu da kamu API'sinin onu oluşturan koddan çok farklı görünmesine neden olacaktır. aşağıdaki kurucu atın:
public Widget(
int id = 0,
string name = "foo",
float width=1.0f,
float height=1.0f,
float depth=1.0f
) { // ...
otomatik burada olası tüm kombinasyonları oluşturmak için mıydı N olmadığından, derleyici, bu tek yapıcısı için kurucular üretmek gerekir! Bunu çağırmak için olası yollar ...
Paging Eric Lippert .... Bence bu derleyici bir özellik olan isteğe bağlı parametrelere iner, ancak CLR olan genel kısıtlamalar. Bu yüzden isteğe bağlı parametreler derleyici tarafından değiştirilir ve JIT yalnızca (gerekli) parametreleri görür. – Richard
@Richard: Temelde konu bu. İsteğe bağlı parametreler de, tam da bu nedenle, sürüm oluşturma için bazı garip yan etkileri var ... –