浮点型和双精度型之间的不明确扩展方法调用

本文关键字:扩展 方法 调用 不明确 双精度型 之间 浮点型 | 更新日期: 2023-09-27 18:36:53

我有以下扩展方法,一种用于浮点数,一种用于双精度。

public static string ToTimeString(this float f, TimeStringAccuracy accuracyFlags = DefaultAccuracyFlags, TimeStringSeparator separator = DefaultSeparator)

public static string ToTimeString(this double d, TimeStringAccuracy accuracyFlags = DefaultAccuracyFlags, TimeStringSeparator separator = DefaultSeparator)

当我从Visual Studio单元测试调用函数时,测试运行正确,并且调用没有歧义。当我从 Unity3D 代码中调用函数进行浮点运算(使用 Mono)时,这两者之间的调用是不明确的。为什么编译器不知道它应该调用浮点扩展?可能是莫诺造成的吗?

这是调用:

float i = 1f;
i.ToTimeString();

编译器错误:

Assets/Scipts/UIScripts/GameplayUIWindow.cs(61,48): error CS0121: The call is ambiguous between the following methods or properties: ToTimeString(this double, TimeStringAccuracy, TimeStringSeparator)' and `ToTimeString(this float, TimeStringAccuracy, TimeStringSeparator)'

浮点型和双精度型之间的不明确扩展方法调用

试试这个版本:

public static string ToTimeString<T>(this T target, TimeStringAccuracy accuracyFlags = DefaultAccuracyFlags, TimeStringSeparator separator = DefaultSeparator) where T : struct

它可以在 Mono 中编译为不同的代码,但仍允许您以您想要的方式使用代码。作为免责声明,我建议对方法主体内部的类型参数 T 进行一些类型检查,以确保该方法的行为方式符合预期类型(如浮点数和双精度型),并为意外类型(如 int 或 Enum)引发异常。