【发布时间】:2021-12-06 19:18:03
【问题描述】:
我想出了以下易于扩展的"bit bucket":
unit BitBucket;
interface
type TBitBucket = class
private
class procedure ThrowAway<T>(value: T); static;
public
class property Integer: Integer write ThrowAway;
class property String_: String write ThrowAway;
class property Extended: Extended write ThrowAway;
class property Boolean: Boolean write ThrowAway;
end;
implementation
class procedure TBitBucket.ThrowAway<T>(value: T);
begin
end;
end.
但是,虽然 IDE 中没有波浪线下划线,但它无法编译,并出现以下错误:
[dcc32 错误] BitBucket.pas(9): E2008 不兼容类型
[dcc32 错误] BitBucket.pas(10): E2008 不兼容类型
[dcc32 错误] BitBucket.pas(11): E2008 不兼容类型
[dcc32 错误] BitBucket.pas(12): E2008 类型不兼容
我是否缺少一个可以编译的技巧?我尝试将泛型类型参数指定为ThrowAway,但这会导致更多错误。显而易见的替代方法是为每种类型编写一个ThrowAway 方法,但这很快会导致很多代码实际上什么都不做。
对于那些想知道为什么在 delphi 中,您可以使用编译器开关来防止使用函数而不分配它们的返回值以与旧代码兼容的人。使用 BitBucket,您可以说 BitBucket.Integer := FunctionThatHasSideEffectsAndReturnsAnInteger(...);,而无需创建新变量。我也觉得很好笑。
【问题讨论】:
-
Delphi 泛型比它的 C++ 泛型更受限制。无论如何,丢弃函数的结果是完全有效的。你说的那个开关是默认开启的。
-
快速但丑陋且相当愚蠢的解决方案:
procedure ThrowAway(const X: Variant); begin end; -
@AndreasRejbrand 在参数列表中使用
const X或const X: Variant只会导致相同的错误。 -
const X不起作用,但const X: Variant起作用。 privat.rejbrand.se/ThrowAway.pas -
啊,我明白你现在的意思了,但这并不是真正使用相同的 bitbucket 模拟。我正在尝试发现类和属性的功能。顺便说一句,我之前在 RAD Studio 10.2 中工作,在 10.4 下做同样的事情确实会给代码红色波浪线。
标签: delphi