经常看到一个枚举数据类型当函数使用,参数是负一,不知道这代表什么意思呀,比如:
type
Tcolor=(cwhite,cred,cblue);
var
colorname:string;
implementation{$R *.dfm}function test(colorname:string):Tcolor;
var
I:Tcolor;
begin
result:=Tcolor(-1);
showmessage(colorname);
end;
不知道上面的result:=Tcolor(-1);到底代表什么意思呢,参数是负1,这只是一个枚举类型呀,怎么可以当函数来用
type
Tcolor=(cwhite,cred,cblue);
var
colorname:string;
implementation{$R *.dfm}function test(colorname:string):Tcolor;
var
I:Tcolor;
begin
result:=Tcolor(-1);
showmessage(colorname);
end;
不知道上面的result:=Tcolor(-1);到底代表什么意思呢,参数是负1,这只是一个枚举类型呀,怎么可以当函数来用
当然,默认情况下,有序类型是从0开始的。
别把其它语言的概念搬到D里来
枚举在内存里也是跟Integer一样储存的 只是默认是 从 0 开始的 范围是 0 到 枚举值的数量
强制把枚举变量 赋-1
就是想 让这变量不在 枚举 的范围内 一般是用在没定义空 枚举 的情况
可在有些情况下会带来问题
program Project2;{$APPTYPE CONSOLE}uses
SysUtils;type
Tm=(wrazrb,avqdux,vphfnl,qdvtho,jidrqp,vesxuh,luzhva,nvxvda,zicofk,ajoebw,aaaasadas,
seubxp,rdcwez,zawdlk,lmsxhf,puxhxl,vnpzea,yydlqq,mzmtmg,zanwmw,hmcjgm,tgfesn,
sbbnrw,dssizk,zohceu,agifgy,sgqiri,lucqko,ahflaj,gsniep,rqsspl,xmrmjk,nhnfso,
bmknjy,obnaag,suyaww,ufqwss,euxsxo,pucslh,vgtcqe,iphkqt,xlxpvs,lhynxu,vvjkst,
xsgzmj,wuegjl,pnteza,ldukju,zfpkij,dmerkn,eypjbf,zsuqob,cljwpb,moduva,qitruq,
isouiw,afxgce,ajsllm,fuijie,xvvjvz,qwlqax,dymjuw,ydieqg,fzzzch,shiixo,mqbdct,
gmwjwu,ohmhwg,hthulh,rknycb,szwmyv,lxffye,rqphsg,fepgav,luodzf,kkvije,uvqncz,
kpjfsn,ioadyv,rkcvwa,hcbuoh,lzltqk,jcablw,zoulbz,iznitb,jvutdo,cgsykq,iwudbd,
hkdxnw,znnprl,bagozu,odmokz,ptvfpm,bfvsih,trtnil,gltlsh,dympts,kyfwfa,firwww,
ouvdnz,wjfncu,rykpet,ccnasm,vrmeai,teofsy,ywxpkh,ydtjfu,lvbfpz,noenxa,mvbdgn,
flcdun,cwaqgm,vvntte,zneion,uyxzdh,hrtglx,foslwv,lhrgpj,swnymx,uorqrs,epyxpa,
oykghy,orphmm,cdvcqf,dnqkcp,foizhw,harqeg,pdwabn,ojjurm,emlghh,iiyrsd,fdxbgf,
qrrjpu,rrvsll,pomttf,efuyeh,ypelta,yoogyn,orfzrq,fnyadz,aeonjl,kmkesl,asweqi,
cucngr,yfieff,fqbkau,lbagwr,clzopb,lpbshk,pfxlgn,aelvtp,haeemu,nuktct,ivkeze,
uowzdh,fkerxe,qxnkil,iixgmi,zcsswr,khynwn,ssdone,hxhwbp,gqyezs,ybjfyl,dgzrsx,
fvuwfo,mnavxt,csdreh,skhjtc,rpylrn,oojndl,qmrkgf,snzwfs,ijemiz,yubroh,bpwajv,
igwaur,ambcdg,fpcfum,ytrjqv,syqwwh,fwcozx,angfrv,vssaaf,ilyvnp,swyyvk,ulrogz,
pvoxiw,oqzpop,txxgim,wwruxl,uwlibo,zogpte,mjiiwd,hepwhv,zuovtd,lvuoqu,oudopd,
gpphrj,gdjyev,xgsxry,dfqfsi,azslhk,ghcmmf,nynzfq,jyxvla,suqeqj,uqepfb,otvdwa,
ojuykq,bjfsya,anquxa,uuwnmt,bptkyt,ilcasz,hsatdx,kpjsth,hporhm,kanehn,gitvdb,
niaiew,usilkc,ssznnx,yubldk,hhncug,mjqzyd,kecmir,bgqjwg,lbecpn,rdkfij,mvqnpq,
zmoqfc,rpgszm,qcfmxv,cfgnax,lqglya,ftnfjs,qpjsag,qhugwe,mvjvfd,egpixc,nefjlu,
jgalxt,gqwymo,nwwqgg,bwmjmz,qsdbri,fecpjl,mpvoux,hlymtm,tfqzvy,lkzzft,laybja,
kymfsa,kmwpen,orarho//,Add//去掉前面的注释 SizeOf(Tm) 为2 因为超过 255了 8位容不下
);
var
I:Integer;
S:string;
m:Tm;
begin
Randomize;
Writeln(SizeOf(Tm));//1
//-1 在内存里 是 FFFFFFFF
//Tm 是一字节 所以就只有 低位 FF 有效 FF 十进制是 255 = orarho
//所以 -1 不是神 有些情况下是会带来错误
//正确的方法是 定义 枚举时 给个None 标记
m := Tm(-1);
I:=Ord(m);
Writeln(I);
Readln;
end.
你检测他呢?
还是 if m = Tm(-1) then ...?
这显然不是个良好的习惯.