将 0 传递给重载函数,其中一个重载采用枚举,另一个重载采用双精度,是不明确的

问题描述 投票:0回答:1

我有一个重载的函数。其中一个函数需要一个

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);
}
c# enums overloading
1个回答
1
投票

因为

0
的类型是
int
,它可以隐式转换为
double
或任何
Enum
类型,这会导致歧义。要在不更改调用站点的情况下消除方法之间的歧义,您需要准确地将重载方法定义为:

public static void Foo(int value)
{
    Foo((double)value);
}
© www.soinside.com 2019 - 2024. All rights reserved.