我已经编程了五年的第一个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)