首先,我需要知道我尝试做的事情是否可行。如果可行,我需要知道如何实现。
更好的方法是演示问题而不是解释它,所以让我们开始吧:
我有一个“增强记录”(目的是生成“智能字符串”类型来替换正常的字符串类型 - 虽然这对于这个问题并不重要):
TLKString = record
Value: String;
// Some methods here to operate on and build String values
// Allows me to assign String values directly to "instances"
// of this record type! I have others (hence "overload") to
// handle other data types (such as Integer etc.)
class operator Implicit(const AValue: String): TLKString; overload;
end;
我现在可以按以下方式使用这个TLKString类型:
var
LSmartString: TLKString;
begin
LSmartString := 'Hello World'; // The "Implicit" operator then
// assigns this to LSmartString.Value
end;
好的,到目前为止一切都很棒!现在我们遇到了问题...
我需要能够将 LSmartString(TLKString 的“实例”)的值分配给普通的 String 变量...
var
LSmartString: TLKString;
LNormalString: String;
begin
LSmartString := 'Hello World';
// The next line works fine, but is not what I want!
LNormalString := LSmartString.Value;
LNormalString := LSmartString; // E2010 (Incompatible Types)
end;
这是我遇到的问题,如你所见,上面代码段的最后一行导致了E2010 不兼容类型: 'string' 和 'TLKString'。当然,我知道这会发生...但我不知道是否可以通过在我的TLKString记录类型上重载运算符来克服这个问题,如果可以,我需要重载哪个运算符。
如果这不可能,那么CodeGear和Embarcadero没有为增强型记录类型分配值处理
Implicit
和Explicit
运算符,但却没有处理相反情况的运算符,这让我感到有点愚蠢。