delphi - 类运算符 - 区分大小写是设计原因还是缺陷?

标签 delphi operators case-sensitive delphi-10.1-berlin

在处理我称为 TVersion 的记录类型时,我使用 class operators 。我偶然发现了一些相当令人惊讶的事情 - 运算符(operator)名称被视为区分大小写。

Delphi 的一大优点是它不区分大小写。然而,类运算符似乎违反了这条规则——至少在代码洞察方面是这样。

奇怪的是,如果定义和实现都使用相同的大小写,则不会引发错误,无论我实际如何大写它们。但是,如果定义和实现的大小写有任何不同,它会用红色下划线并给出错误:

`TVersion` does not contain a member named 'Implicit'

对于我在此记录中的任何类运算符,都会发生同样的情况。在下面的代码中,第一个隐式类运算符在定义中为小写,但在实现中为大写。其余的都是匹配的。在实现中,Implicit 带有红色下划线,并且我在 Structure 窗口左侧看到了提到的错误。

无论出现任何错误,一切都可以正常编译。无论案件是否匹配,我都没有看到任何区别。只是这个恼人的编辑器错误。它甚至不会在编译时作为警告显示在 Messages 中。

这是一个错误吗?或者我应该关心这些类运算符的大小写敏感性吗?上面链接的文档似乎没有提及它。

unit JD.Version;

interface

type
  TVersion = record
    Values: array of Integer;
    function Count: Integer;
    class operator implicit(a: TVersion): String;
    class operator Implicit(a: String): TVersion;
    class operator Equal(a, b: TVersion): Boolean;
    class operator LessThan(a, b: TVersion): Boolean;
    class operator GreaterThan(a, b: TVersion): Boolean;
    class operator GreaterThanOrEqual(a, b: TVersion): Boolean;
    class operator LessThanOrEqual(a, b: TVersion): Boolean;
    class operator NotEqual(a, b: TVersion): Boolean;
  end;

implementation

uses
  SysUtils, Math;

{ TVersion }

class operator TVersion.Implicit(a: TVersion): String; //Error: 'TVersion' does not contain a member named 'Implicit'
var
  X: Integer;
begin
  Result:= '';
  for X := 0 to Length(a.Values)-1 do begin
    if X > 0 then Result:= Result + '.';
    Result:= Result + IntToStr(a.Values[X]);
  end;
end;

class operator TVersion.Implicit(a: String): TVersion;
var
  S, T: String;
  I: Integer;
begin
  S:= a + '.';
  SetLength(Result.Values, 0);
  while Length(S) > 0 do begin
    I:= Pos('.', S);
    T:= Copy(S, 1, I-1);
    Delete(S, 1, I);
    SetLength(Result.Values, Length(Result.Values)+1);
    Result.Values[Length(Result.Values)-1]:= StrToIntDef(T, 0);
  end;
end;

class operator TVersion.Equal(a, b: TVersion): Boolean;
var
  la, lb: Integer;
begin
  la := Length(a.Values);
  lb := Length(b.Values);
  if la <> lb then
    Result := False
  else if la = 0 then
    Result := True
  else
    Result := CompareMem(a.Values, b.Values, la * SizeOf(Integer));
end;

class operator TVersion.LessThan(a, b: TVersion): Boolean;
var
  la, lb, i: Integer;
begin
  la := Length(a.Values);
  lb := Length(b.Values);
  for i := 0 to Min(la, lb) - 1 do
    if a.Values[i] < b.Values[i] then   // 1.2.xxx < 1.3.xxx
      Exit(True)
    else if a.Values[i] > b.Values[i] then //1.3.xxx > 1.2.xxx
      Exit(False);
  Result := la < lb;
end;

class operator TVersion.GreaterThan(a, b: TVersion): Boolean;
begin
  Result:= b < a;
end;

class operator TVersion.GreaterThanOrEqual(a, b: TVersion): Boolean;
begin
  Result:= (a > b) or (a = b);
end;

class operator TVersion.LessThanOrEqual(a, b: TVersion): Boolean;
begin
  Result:= (a < b) or (a = b);
end;

class operator TVersion.NotEqual(a, b: TVersion): Boolean;
begin
  Result:= not(a = b);
end;

function TVersion.Count: Integer;
begin
  Result:= Length(Values);
end;

end.

这是我所看到的:

Screenshot - Editor Errors

最佳答案

这是 Error Insight 中的一个错误后台编译器。语言本身不区分大小写。

关于delphi - 类运算符 - 区分大小写是设计原因还是缺陷?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44487305/

相关文章:

mysql - 使用 OR 和 NAND 选择查询

bash - 不可能的 bash : syntax error: invalid arithmetic operator (error token is "")

css - 我可以在 CSS 类名中使用 camelCase 吗?

delphi - XML 中的位操作 Delphi - Bitwise

c++ - 为什么我不能使用间接运算符取消引用指向作为数组元素的对象的指针?

class - 如何在 Delphi 中声明类方法的类型?

url - 区分大小写的 URL - 这可以避免吗?

Git SVN 区分大小写的文件夹名称

algorithm - 不重复 N 个元素的组合,不使用 for..to..do

delphi - 如何模拟日期和现在?