【发布时间】:2011-01-17 21:09:34
【问题描述】:
刚刚发现了一件很有趣的事情:
var
Queue : TQueue <TProc>;
MyProc : TProc;
...
MyProc := Queue.Dequeue;
我想你明白这里的意图是什么。但是编译器认为我想将Queue.Dequeue方法(类型“对象过程”)存储在MyProc中并报错
E2010 Incompatible Types: 'TProc' und 'Procedure of object'
我想出的解决方法是这样的
MyProc := TProc (Pointer (Queue.Dequeue));
有没有更优雅的解决方案?
【问题讨论】:
-
第 1 课:调用函数或过程时总是加 () ;-)
-
@Jeroen:呃!太像我的口味了。更好的教训:编译器应该能够说出这里想要什么。此外,正如 Rob 在他对我的帖子的回复中提到的,它的类型错误。 Smasher,您应该将此作为 QC 中的错误报告。
-
@Mason:编译器不能,因为它需要向后兼容这种歧义。这是其他语言不允许这种歧义的原因之一。是的,我同意,() 一开始看起来很奇怪,但后来你会欣赏额外的清晰度。
-
考虑到 Barry 的回答,我不会在 QC 中报告此问题。我认为在编译器无法正确确定类型的极少数情况下使用 () 是可以的。
-
Smasher,编译器在错误消息中提到的类型实际上是是兼容的。编译器为赋值右侧报告的类型与方法的类型或方法的返回类型不匹配。该问题与任何一种解释是否会产生合法转让无关。
标签: delphi