Почему эти типы записей конфликтуют?

StackOverflow https://stackoverflow.com/questions/834121

  •  08-07-2019
  •  | 
  •  

Вопрос

Учитывая следующие типы записей:

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. В нем просто говорится "нет присвоения для поля" Данные ".

Изменение имен параметров также не помогает, Я тоже это попробовал:

 {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!» ... предоставляя диасимбигуляция первого тега поля, в котором вы управляете выводом типа в правильном направлении.)

Код ниже компилируется на 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 }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top