我有一个重载的函数。其中一个函数需要一个
double
。另一个是命名枚举 MyEnum
。
如果我用 0 调用这个函数,它会抛出编译时异常
Compilation error (line 8, col 3): The call is ambiguous between the following methods or properties: 'Program.Foo(double)' and 'Program.Foo(MyEnum)';
重现代码:
using System;
public class Program
{
public static void Main()
{
Foo(1); // No ambiguity
Foo(0); // Ambiguity
}
public static void Foo(double value)
{
}
public static void Foo(MyEnum value)
{
}
}
public enum MyEnum
{
A,
B,
C
}
https://dotnetfiddle.net/Widget/Preview?url=/Widget/uR0d0F
为什么它不能解决双重载问题?我知道所有枚举都可以是值
0
。我猜测对于编译器来说,MyEnum.A
和0
是无法区分的。
我正在创建一个 API。使用泛型或对函数进行其他一些更改是否可以避免此问题,而不会改变消费者调用该函数所需执行的操作?
-- 编辑-- 通过添加解决:
public static void Foo(int value)
{
Foo((double)value);
}
因为
0
的类型是int
,它可以隐式转换为double
或任何Enum
类型,这会导致歧义。要在不更改调用站点的情况下消除方法之间的歧义,您需要准确地将重载方法定义为:
public static void Foo(int value)
{
Foo((double)value);
}