拿这个小示例类(不是我的真实代码,但它暴露了问题):
Convert = class(TObject)
public
class function ToString(value: Double): String; overload;
class function ToString(value: TDateTime): String; overload;
end;
Run Code Online (Sandbox Code Playgroud)
它会编译好,直到您尝试使用Double
或TDateTime
函数As In:
var
d: Double;
begin
d := 99.99;
ShowMessage(Convert.ToString(d));
Run Code Online (Sandbox Code Playgroud)
您将收到此编译错误:对'ToString'的不明确的重载调用.问题归结为这TDateTime
是一种类型的事实Double
我的问题:你如何处理这类问题?
编辑 - 我不是在寻找给出的例子的解决方案
到目前为止我找到了3个解决方案:
那里有其他解决方案吗?
Dav*_*nan 14
重载方法可能非常有效.然而,一旦有一丝模糊,他们就会成为一种责任.一个很好的例子是XE3中引入的新TStream重载.不容易陷入编译器选择您不期望的重载的陷阱.至少在你的代码中编译器停止了.从那个意义上说你很幸运.
所以,在你的情况下,我的建议是放弃超载.在方法名称中表示不同的输入类型.是的,它有点冗长,但你不会犯任何错误,你的代码将编译!
您发布的示例在XE中编译并执行正常.
在评论中,您将提供此示例:
ShowMessage( Convert.ToString( 99.99 )); // <- gives compiler error 2251
Run Code Online (Sandbox Code Playgroud)
在这种特殊情况下,解决方案是明确定义类型(我认为):
ShowMessage( Convert.ToString( Double(99.99) )); // <- E2089, Invalid Typecast
Run Code Online (Sandbox Code Playgroud)
查看文档:
对于规则不允许的类型转换,将发出此错误消息.允许以下类型的演员表:
- 序数或指针类型为另一个序数或指针类型
- 字符串,字符串,字符数组或字符串的pchar
- 变体的序数,实数,字符串或变体
- 序数,真实,字符串或变体的变体
- 对任何类型相同大小的变量引用.
因此,要明确告诉编译器选择Double
重载函数:
ShowMessage( Convert.ToString( Double(Variant(99.99)))); // Ok
Run Code Online (Sandbox Code Playgroud)
或许有点费解.但对于其他重载函数,它更简单:
ShowMessage( Convert.ToString( EncodeDate(2013,1,5));
Run Code Online (Sandbox Code Playgroud)
更新
要使其成为适用于所有类的通用解决方案,请考虑添加类函数以解决模糊类型.
Convert = Class(TObject)
...
class function AsDouble( value: Double) : Double; inline; static;
class function AsTDateTime( value: TDateTime) : TDateTime; inline; static;
end;
class function Convert.AsDouble(value: Double): Double;
begin
Result := Value;
end;
class function Convert.AsDateTime(value: TDateTime): TDateTime;
begin
Result := Value;
end;
Run Code Online (Sandbox Code Playgroud)
现在,您可以使用常量调用重载的类函数:
ShowMessage( Convert.ToString( Convert.AsDouble(99.99)));
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2556 次 |
最近记录: |