2008-10-14 14 views
14

Właśnie zauważyłem, że można to zrobić w C#:C#: Jak to działa: Unit myUnit = 5;

Unit myUnit = 5; 

zamiast to zrobić:

Unit myUnit = new Unit(5); 

Czy ktoś wie, w jaki sposób można to osiągnąć z moich własnych strukturach? Spojrzałem na moduł Unit z reflektorem i zauważyłem, że został użyty atrybut TypeConverter, ale po utworzeniu niestandardowego TypeConvertera dla mojej struktury nadal nie mogłem uzyskać kompilatora pozwalającego na taką wygodną składnię.

Odpowiedz

31

Musisz podać niejawny operator konwersji z int do jednostki, tak jak poniżej:

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 zawsze nowe rzeczy uczyć się - nie mogę uwierzyć, że nigdy nie spotkałem się z tym przed – cbp

+0

Istnieje również "wyraźny" rzut - działa tak samo, ale osoba dzwoniąca musi dodać (Jednostka); zwykle używane, gdy istnieje ryzyko utraty danych (precyzja/zasięg/skala/itp. - na przykład float => int) –

+0

Przeciążanie operatorów jest bardzo potężne, ale lekko stąpajcie, kiedy to robicie: Łatwo jest stworzyć kod, który kończy się bardzo nieprzewidywalny dla programistów konserwacji. Użyj go, gdy jest to właściwe (np. W przypadku urządzenia), ale nie przesadzaj. (I zawsze upewnij się, że jest dobrze udokumentowany!) –

2

Musisz podać operatora obsady dla klasy, która przyjmuje Int32.

+0

Minor korekta: w rzeczywistości jest to operator _conversion_ (patrz 10.10.3 w specyfikacji MS) –