Stworzyliśmy strukturę Id32
i Id64
do przechowywania liczb całkowitych i wartości długich pochodzących z DB, dzięki czemu można je jawnie przetwarzać jako identyfikatory przez konwerter Json (z dedykowanymi niestandardowymi konwerterami).Środowisko wykonawcze niejawnie rzutuje z obiektu
Problemem jest to, że możemy odczytać te dane z Dictionary<string, object>
że faktycznie jest DataRow
-jak obiekt gdzie string
część to nazwa kolumny i object
część jest wartością.
Więc przed mieliśmy ten kod, aby odczytać wartość:
int myVal = (int)row["COLUMN"]
Chcemy ten kod, aby kontynuować pracę także po tych zmianach.
Ale ponieważ row["COLUMN"]
jest object
(@ czasie kompilacji) niejawny oddanych zawodzi, mimo że w rzeczywistości jest Id32
(@ run-time).
Poniższy oczywiście działa:
int myVal = (Id32)row["COLUMN"]
Ale czy jest jakiś sposób aby rozwiązać ten bez modyfikowania kod, który odczytuje wartość?
Jest to kod struct:
public struct Id32
{
public readonly int Value;
public Id32(int id) { this.Value = id; }
public static implicit operator int(Id32 id) { return id.Value; }
public static implicit operator Id32(int id) { return new Id32(id); }
}
Zobacz również: http://stackoverflow.com/questions/1611083/will-the-c-sharp-compiler-perform-multiple-imicit-conversions-to-get-from-one –
To pytanie dotyczy konwersji niejawnych , nie rzuca. Chociaż rzutowanie jest zaangażowane (masz "obiekt" i trzeba go przesłać do 'int', być może wewnątrz niejawnej konwersji z' obiektu 'zdefiniowanego w' Id32'). – binki