每当我使用以下结构时,我仍然无法弄清楚如何摆脱有关未初始化变量的警告,即使我知道这种情况永远不会发生.
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种解决方案,但我不喜欢它们.特别是有更多的变量或陈述.有没有其他方法可以避免这种情况?
{$WARN USE_BEFORE_DEF OFF}和包裹功能{$WARN USE_BEFORE_DEF ON}else Exit;与Result := 0上开始通过做类似以下的事情
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.在实践中有很多方法可以产生.因此,如果您正在编写完整的代码,则需要满足这种可能性.编译器只是警告你,你没有迎合这种可能性.