重载方法如何工作

Jen*_*olt 5 .net c#

我已经编程了五年的第一个Delphi和现在的c#所以我想我知道重载方法是如何工作的,但显然不是.

首先是一些代码

public enum TestEnum { Option1, Option2, Option3 }

public class Setting
{
    public Setting()
    {
        AddSettings();
    }

    protected void CreateSetting<TEnum>(string AName, TEnum AValue) where TEnum : struct, IComparable, IFormattable
    {
        //do stuff
    }

    protected void CreateSetting(string AName, string AValue)
    {
        //do stuff
    }

    protected void CreateSetting(string AName, int AValue)
    {
        CreateSetting(AName, AValue.ToString());
    }

    protected void AddSettings()
    {
        CreateSetting("Language", (byte)0); //#1
        CreateSetting("BFL", "true"); //#2
        CreateSetting<TestEnum>("TestEnum", TestEnum.Option1); //#3
        CreateSetting("TestEnum", TestEnum.Option1); //#4
    }
}
Run Code Online (Sandbox Code Playgroud)

我为每次调用CreateSettings添加了一个数字,以便更容易解释.

我的问题是:

调用#1调用CreateSettings的错误(通用)版本,因为我已经进行了一次转换,byte但是为什么呢?

呼叫#2工作得很好.

呼叫#3也可以正常工作.我明确地调用了泛型版本

调用#4也可以工作,但有一些"魔术",编译器会解析正确的(通用)版本并调用它.但为什么它有效呢?

我已经发现#1调用了错误版本的原因与#4相同.我只是想知道是否有人可以给我一个解释.

mat*_*mmo 10

重载正在按预期工作,你声明:

#1调用错误的版本

它调用了正确的版本,因为你正在做的是将其转换int为a byte,所以你不再有int变量,你有一个byte.你期望它与int超载相匹配吗?怎么可能,你只是将变量转换为a byte.

呼叫#4也有效但有一些"魔力"

这不是魔术,这基本上是因为与上面相同的原因,类型既不是inta或a string,所以它可以调用的唯一其他可能的重载是泛型的,因为你的"泛型"方法基本上说任何其他类(这里的类型是TestEnum)