2011-03-01 18 views

cevap

1
için yapıcı değiştirin

: "neden", 11.3.8 Constructors ve 5.3 Definite assignment başvurmak için şöyle

public A(int x) : 
    this() 
{ 
    B = x; 
} 

struct A 
    { 
     private int b; 

     public A(int x) 
     { 
      B = x; 
     } 
     public int B 
     { 
      get { return b; } 
      set { b=value; } 
     } 

    } 

aşağıdaki hatayı alırsınız. MSDN itibaren

+0

Sadece merak hakkında fikir alacak cevap Gözat, ne fark eder ki? –

+0

Bu sorun – Dotnet

+0

@Gunner çözmek için yapar: Eğer tüm üretim dallarında alan başlatıcıları bahsediyor – Dotnet

1

"Onlar const veya statik olarak beyan edilmedikçe bir yapı beyanı içinde, alanlar başlatıldı edilemez."

+0

atanır önce 'Bu' nesne kullanılamaz gibi bir hata olacaktır Değilse Bu kod bu hatayı kaldıracak; Bu ** bir alan başlatıcısı değil. –

4

bir yapı nicelikleri tüm herhangi yöntemleri veya özelliklerini kullanmadan önce kesinlikle atanacak var. İki olası düzeltmeler burada vardır:

1) Açıkça parametresiz oluşturucu arayabilirsiniz:

public A(int x) : this() 
{ 
    B = x; 
} 

2) yerine mülkiyet alanı kullanabilirsiniz: Elbette

public A(int x) 
{ 
    b = x; 
} 

ikinci seçenek yalnızca mevcut haliyle çalışır - otomatik özellik kullanmak için yapı değiştirmek isterseniz ilk seçeneği kullanmak sahip .

Ancak önemlisi, artık bir değişken yapı var. Bu neredeyse her zaman çok kötü bir fikirdir. Ben şiddetle Eğer şöyle bir şey yerine kullanmak çağırıyorum:

struct A 
{ 
    private readonly int b; 

    public A(int x) 
    { 
     b = x; 
    } 

    public int B { get { return b; } } 
} 

DÜZENLEME: Orijinal kod çalışmıyor neden Daha fazla ayrıntı ... C# spec bölüm 11.3.8 itibaren

: başlangıçta bu Şimdi

If the struct instance constructor doesn't specify a constructor initializer, the this variable corresponds to an out parameter of the struct type

kesinlikle yürütemediğinden anlamına gelir, atanmış olmayacak herhangi biri (mülkiyet belirleyiciler dahil) üye işlevi kadar yapı varlık yapısının bütün ilkler ed kesinlikle atanmıştır. Derleyici 'u bilmez veya'u bilir veya özellik belirleyicisinin başka bir alandan okumaya çalışmadığı gerçeğini dikkate almaya çalışır. Her şey kesinlikle atanmamış olan alanlardan okumaktan kaçınır.

+0

Ben anlamıyorum. Aynı (b = değer) özelliğini yapan ve bunu manuel olarak yapan özellik ayarı arasındaki fark nedir? Yine de neden B = x'in çalışmadığını göremiyorum. BTW yapı değişkenleri alanlar veya bunları değişken olarak adlandırmalı mıyım? – Mocco

+0

@Cocodrilo - çünkü tam olarak başlatılana kadar bir yapıya sahip * bir şey * yapamazsınız, bu varsayılan (ve, olduğu gibi, sahte) yapıcıyı çağırarak olabilir veya tüm alanları açıkça atayarak olabilir. Tamamlanana kadar bir mülke (bir yöntem) erişemezsiniz. Yukarıdaki "1", ilk seçeneği (yapıcı) gösterir, "2" yukarıdaki "tüm alanları atama" seçeneğini gösterir. –

+0

@Cocodrilo ve sadece ikinci Jon'un noktasına; Değişebilir yapılar çok çok kötü mojolardır. –

İlgili konular