经常看到一个枚举数据类型当函数使用,参数是负一,不知道这代表什么意思呀,比如:
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,这只是一个枚举类型呀,怎么可以当函数来用 

解决方案 »

  1.   

    我知道了,先写个result等于多少,是以防止后面假如没给result赋值,结果产生混乱,写了Tcolor(-1)这样result就会返回空值,因为枚举类型是有序类型,参数都是正整数
      

  2.   

    因为一般第一个是0.比如 for i:= 0 to Count-1 do ... 所以-1表示没有
      

  3.   

    枚举表示的就是有序类型,有序类型当然也可以自己定义顺序,如:TABC = (ta = -1, tb = 0, tc = 10);
    当然,默认情况下,有序类型是从0开始的。
      

  4.   

    应该是黑色,有符号整数是按照补码的方式存储的,-1是$FFFFFFFF,应该是黑色
      

  5.   

    又见空值...
    别把其它语言的概念搬到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.
      

  6.   

    再就是 你给一个枚举 赋 -1
    你检测他呢?
    还是 if m = Tm(-1) then ...?
    这显然不是个良好的习惯.