2008-10-14 17 views
14

Sadece bunu yapmak zorunda olduğunuzu farkettim:C#: Bu nasıl çalışır: Unit myUnit = 5;

Unit myUnit = 5; 

bunu yapmak zorunda kalmadan:

Unit myUnit = new Unit(5); 

Bunu kendi yapılarmla nasıl başarabileceğimi bilen var mı? Reflektör ile Unit yapısına baktım ve TypeConverter özniteliğinin kullanıldığını fark ettim, ancak yapmam için özel bir TypeConverter oluşturduktan sonra derleyiciyi bu kullanışlı sözdizimine izin veremedim.

cevap

31

Sen Birimine int bir örtük dönüştürme operatör temin şöyle gerekir:

public struct Unit 
    { // the conversion operator... 
     public static implicit operator Unit(int value) 
     { 
      return new Unit(value); 
     } 
     // the boring stuff... 
     private readonly int value; 
     public int Value { get { return value; } } 
     public Unit(int value) { this.value = value; } 
    } 
+0

Oooh her zaman yeni şeyler öğrenmek - – cbp

+0

'dan daha önce hiç karşılaşmadığımı düşünemiyorum. Ayrıca bir "açık" oyuncu kadrosu da vardır - aynı şekilde çalışır, ancak arayan kişi eklemelidir (Birim); genellikle veri kaybı riski olduğunda kullanılır (hassas/aralık/ölçek/etc - örneğin float => int) –

+0

Aşırı yükleme operatörleri çok güçlüdür, ancak bunu yaparken hafifçe basmak: Sarsılmakta olan kodları yapmak kolaydır bakım programcıları için çok tahmin edilemez. Uygun olduğunda kullanın (Ünite durumu gibi), fakat aşırıya kaçmayın. (Ve her zaman iyi belgelenmiş olduğundan emin olun!) –

2

Int32 alan sınıf için bir işleci sağlamanız gerekir.

+0

Minör düzeltme: aslında bir _conversion_ operatörü (MS spesifikasyonundaki 10.10.3 bakınız) –