问题描述
使用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 (将#修改为@)