case语句中未初始化的变量

Tri*_*ber 1 delphi delphi-xe6

每当我使用以下结构时,我仍然无法弄清楚如何摆脱有关未初始化变量的警告,即使我知道这种情况永远不会发生.

TCustomEnum = (ceValue1, ceValue2, ceValue3);

function DoSomething(LI_Enum: TCustomEnum): Integer;
var
  lNumber : Integer;
begin
  case LI_Enum of
    ceValue1 : lNumber := 1;
    ceValue2 : lNumber := 2;
    ceValue3 : lNumber := 3;
  end;
  Result := 2 * lNumber;
end;
Run Code Online (Sandbox Code Playgroud)

W1036变量'lNumber'可能尚未初始化

我找到了3种解决方案,但我不喜欢它们.特别是有更多的变量或陈述.有没有其他方法可以避免这种情况?

  1. {$WARN USE_BEFORE_DEF OFF}和包裹功能{$WARN USE_BEFORE_DEF ON}
  2. 在任何情况下语句中使用else Exit;Result := 0上开始
  3. 初始化每个变量,尽管从不使用该值

Dsm*_*Dsm 6

通过做类似以下的事情

function DoSomething(LI_Enum: TCustomEnum): Integer;
var
  lNumber : Integer;
begin
  case LI_Enum of
    ceValue1 : lNumber := 1;
    ceValue2 : lNumber := 2;
    ceValue3 : lNumber := 3;
    else raise exception.create('Oops I forgot one of the LI_Enum values') 
  end;
  Result := 2 * lNumber;
end;
Run Code Online (Sandbox Code Playgroud)

也许是一个更好的异常文本,甚至根本不会引发异常(并为lNumber分配不同的值),但提出异常确实有助于提示您,例如,在您添加新案例值的六个月后.

编辑

关键在于编译器是正确的.枚举的基础结构是某种形式的(无符号)整数,因此枚举完全有可能包含非法值,例如27.在实践中有很多方法可以产生.因此,如果您正在编写完整的代码,则需要满足这种可能性.编译器只是警告你,你没有迎合这种可能性.