Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Variables Delphi以不同的方式初始化本地枚举变量_Variables_Delphi_Initialization_Record_Local Variables - Fatal编程技术网

Variables Delphi以不同的方式初始化本地枚举变量

Variables Delphi以不同的方式初始化本地枚举变量,variables,delphi,initialization,record,local-variables,Variables,Delphi,Initialization,Record,Local Variables,我使用DelphiRio10.3.3创建了一个记录,其中包含两个字段,一个相等比较运算符。其中一个字段是枚举数。 当我创建两个这种类型的变量而不“构建它们”并与另一个进行比较时,如果变量为“inline”,则比较返回的值相等。但是,如果变量是通过传统方式进行的,则比较将返回False。枚举数字段在以传统方式声明时未初始化 type TPropT = (ptYes, ptNo, ptMaybe); MyConfuseRecord = record var

我使用DelphiRio10.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;

这在这个版本的Delphi中是不一致的吗


附言:我读了这篇文章,并没有得出结论。

不,这是偶然的。您没有初始化记录。当您创建一个类的实例时,它被初始化为零。rcords不是这样。@Dsm,你说得对。我没有初始化记录,但我认为相同范围的变量应该具有相同的行为。在本例中,我希望内联变量不会初始化其枚举字段,因为这两个都是局部变量。如果它没有初始化,它将具有之前在该位置的值。这是随机的,或者说是一样的。你声称他们不会做出同样的行为是有缺陷的。如果不将变量初始化为相同的,则无法知道它们的行为是否相同。@Dsm,如果未初始化局部变量(enum)的值是随机的,
Result2.PropT
的值也应该是“越界”的,对吗?但是,在所有情况下,该代码都是
ptYes
。这让我感到困惑。很难理解为什么这里有这么多的讨论。它只是一个局部变量,在分配它之前,它们的值是不可预测的。
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;