質問
次のレコードタイプを考慮する:
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>}
このようなインスタンスを作成しようとすると(完全なコードではなく、コードスニペット):
{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 }
有効な最初の行は受け入れません。 最初の行のサイズはuint32値ですが。 &quot;フィールド 'Data'に割り当てられていません。&quot;
パラメータの名前を変更しても解決しません。 私もこれを試しました:
{new drCode1Body with DrCode = 1uy and Name = name and Timestamp = timestamp and Size = size and Options = options}
その後、次の例外が発生します:
この式にはdrCode1Body型がありますが、ここではdrCode4Body型とともに使用します
ここで必要なレコードタイプを明確に示しています。
何が起こっているのですか?
解決
たとえば、書くことができます
{drCode1Body.DrCode = 1uy ; Name = name ; ...
レコードフィールドラベルが重複する場合に明確にする。
(実際に起こるのは、F#がラベルの読み取りを開始し、それらのラベルを持つ最初のレコードタイプを逆方向に検索することです... DrCodeとNameが見つかると、「確かにdrCode4Body!型推論を正しい方向に向ける最初のフィールドタグのdiasmbiguation。)
以下のコードは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 }
所属していません StackOverflow