Delphi以不同的方式初始化局部枚举变量

问题描述

使用Delphi Rio 10.3.3,我创建了一个包含两个字段的记录,即相等比较运算符。字段之一是枚举数。 当我创建两个这种类型的变量而没有“构建它们”并与另一个变量进行比较时,如果变量“ inline”,则比较结果相等。但是,如果变量是传统方式,则比较返回False。以传统方式声明时,枚举器字段未初始化。

  type
    TPropT = (ptYes,ptNo,ptMaybe);
    MyConfuseRecord = record
      var
       Fprop: String;
       FpropT: TPropT;
    constructor Create(_fieldName: string; aPropT: TPropT = ptMaybe);
    class operator Equal(_aLeft,_aRight: MyConfuseRecord): Boolean;
    class operator NotEqual(_aLeft,_aRight: MyConfuseRecord): Boolean;
    end;

...

constructor MyConfuseRecord.Create(_fieldName: string; aPropT: TPropT);
begin
  Fprop := _fieldName;
  FpropT := aPropT;
end;

class operator MyConfuseRecord.Equal(_aLeft,_aRight: MyConfuseRecord): Boolean;
var
  Comparer: IEqualityComparer<string>;
begin
  Comparer := TEqualityComparer<string>.Default;
  Result := (Comparer.Equals(_aLeft.Fprop,_aRight.Fprop)) and (_aLeft.FpropT = _aRight.FpropT);
end;

class operator MyConfuseRecord.NotEqual(_aLeft,_aRight: MyConfuseRecord): Boolean;
begin
  Result := not (_aLeft = _aRight);
end;

... 以不同的方式进行测试

procedure CompareMyRecords_Inline;
var
  Rs: Boolean;
begin
  var mRec1: MyConfuseRecord;
  var mRec2: MyConfuseRecord;

  Rs := mRec1 = mRec2; //True (mRec1.FPropT is everytime ZERO)
  OutputDebugString(Pchar('Result (Inline) '+ BooltoStr(Rs,True) + ' | value = ' + Integer(mRec1.FPropT).ToString ) );
end;

procedure CompareMyRecords_normal;
var
  mRec1,mRec2 : MyConfuseRecord;
  Rs: Boolean;
begin
  Rs := mRec1 = mRec2; //False
  OutputDebugString(Pchar('Result1 (normal) '+ BooltoStr(Rs,True) + ' | value1 = ' + Integer(mRec1.FPropT).ToString + ' value 2 = ' + Integer(mRec2.FPropT).ToString ));
end;

这与Delphi版本不一致吗?

ps:我读了this个帖子,但没有得出结论。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)