2009-05-07 6 views
1

Compte tenu des types d'enregistrement suivants:Pourquoi ces types d'enregistrements sont-ils en conflit?

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>} 

Si je tente de créer des instances comme celui-ci (des extraits de code, pas de code complet):

{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 } 

Il n'accepte pas la première ligne soit valide. Même si la taille de la première ligne est une valeur uint32. Il dit simplement "aucune assignation donnée pour le champ" Données "."

Modification des noms des paramètres ne permet pas non plus, j'ai essayé cela aussi:

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

Puis-je obtenir l'exception suivante:

Cette expression est de type drCode1Body mais est ici utilisé avec tapez drCode4Body

Pendant que j'indique clairement quel type d'enregistrement je veux ici.

Que se passe-t-il?

Répondre

3

Vous pouvez simplement écrire par ex.

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

de désambiguïser lorsque les étiquettes de champ d'enregistrement se chevauchent.

(Effectivement, ce qui se passe est que F # commence à lire les étiquettes, il recherche en arrière le premier type d'enregistrement avec ces étiquettes ... une fois qu'il voit DrCode et Name, il pense 'sûrement vous voulez dire drCode4Body!' fournir diasmbiguation sur la première balise de champ orienter le type inférence dans le bon sens)

code

ci-dessous compile sur 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 } 
+0

Mais j'ai essayé de donner chaque enregistrement d'un nom de DrCode unique, juste à test comme type drCode1Body = {DrCode1: octet ... et d type drCode2Body = {DrCode2: octet et il a toujours le même résultat – TimothyP

+0

donne la même erreur: {drCode1Body.DrCode = 1uy, drCode1Body.Name = nom, drCode1Body.Timestamp = horodatage, drCode1Body.Size = taille, drCode1Body.Options = options} Mais vous m'avez à quelque chose .... – TimothyP

+0

@ TimothyP: Essayez ceci: let (r1: drCode1Body) = {DrCode = 1uy; .... soit r2 = {DrCode = 2uy; .... soit r3 = {DrCode = 4uy; .... Cela devrait aussi fonctionner, même si la solution de Brian fonctionne pour moi. –