Frage

Unter Berücksichtigung der folgenden Satzarten:

type drCode1Body = {DrCode : byte ; Name : string ; Timestamp : DateTime ; Size : uint32 ; Options : byte}
type drCode2Body = {DrCode : byte ; LastBlock : byte ; BlockNumber : uint16 ; BlockSize : uint16 ; BlockData : array<byte>}
type drCode4Body = {DrCode : byte ; Name : string ; Timestamp : DateTime ; Options : byte ; Size : uint16 ; Data : array<byte>}

Wenn ich versuche Instanzen wie folgt aus (Code-Schnipsel, nicht vollständige Code) zu erstellen:

{DrCode = 1uy ; Name = name ; Timestamp = timestamp ; Size = size ; Options = options}        

{DrCode = 2uy ; LastBlock = lastBlock ; BlockNumber = blockNumber ; BlockSize = blockSize ; BlockData = blockData}

{DrCode = 4uy ; Name = name ; Timestamp = timestamp ; Options = options ; Size = size ; Data = data }

Es nicht akzeptieren, die erste Zeile gültig. Auch wenn die Größe in der ersten Zeile ist ein uint32 Wert. Er sagt einfach „keine Zuordnung für das Feld‚Daten‘gegeben.“

Ändern der Namen der Parameter auch nicht hilft, Ich habe versucht, dies auch:

 {new drCode1Body with DrCode = 1uy and Name = name and Timestamp = timestamp and Size = size and Options = options} 

Dann bekomme ich die folgende Ausnahme:

Dieser Ausdruck hat Typ drCode1Body aber hier wird mit Typ drCode4Body

Während ich klar bin angibt, welche Satzart ich hier soll.

Was ist los?

War es hilfreich?

Lösung

Sie können einfach schreiben z.

{drCode1Body.DrCode = 1uy ; Name = name ; ...

eindeutig zu machen, wenn Datensatzfeld Etiketten überlappen.

(Effektiv was passiert ist, wie F # beginnt die Etiketten zu lesen, es sucht rückwärts zum ersten Satztyp mit diesen Etiketten ... sobald es DrCode und Namen sieht, es denkt ‚sicherlich meinen Sie drCode4Body!‘ ... durch die Bereitstellung diasmbiguation auf dem ersten Feld-Tag Sie die Typ-Inferenz in der richtigen Richtung lenken.)

Code kompiliert unten auf F # 1.9.6.2:

#light
open System
type drCode1Body = 
  {DrCode : byte; Name : string; Timestamp : DateTime; Size : uint32; Options : byte}
type drCode2Body = 
  {DrCode : byte; LastBlock : byte; BlockNumber : uint16; BlockSize : uint16; BlockData : array<byte>}
type drCode4Body = 
  {DrCode : byte; Name : string; Timestamp : DateTime; Options : byte; Size : uint16; Data : array<byte>}
let name = ""
let timestamp = DateTime.Now 
let size = 0u
let size2 = 0us
let options = 0uy
let lastBlock = 0uy
let blockNumber = 0us
let blockSize = 0us
let blockData = [|0uy|]
let data = [|0uy|]
let r1 = {drCode1Body.DrCode = 1uy; Name = name; Timestamp = timestamp; Size = size; Options = options}        
let r2 = {DrCode = 2uy; LastBlock = lastBlock; BlockNumber = blockNumber; BlockSize = blockSize; BlockData = blockData}
let r3 = {DrCode = 4uy; Name = name; Timestamp = timestamp; Options = options; Size = size2; Data = data }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top