如果我有一个函数返回一个int LoadProgress(int),现在相同的函数被更改但它会破坏其他游戏项目,因为现在它需要返回一个keypairvalue,但我错误地删除了原来的函数int lodprogress(int),可以添加相同的函数但输入和输出不同吗?
还有一些功能可以保存和加载来破坏其他游戏项目的文件,我如何确保向后兼容性
答案 0 :(得分:1)
这边界太宽泛/不清楚。需要更多细节来回答您的具体问题。
可以添加相同的功能但输入和输出不同吗?
是的,但返回类型不是签名的一部分,即包含两种方法的类只有不同的返回类型才能编译。
我如何确保保存和加载文件的向后兼容[in]函数[s]
同样,您需要显示代码并解释您想要更改的内容,以便正确回答这些问题,但可选参数可能是最佳选择。
答案 1 :(得分:0)
如果新方法的签名不是旧方法,那就没问题了。
例如,这些不存在冲突,其签名类型不同:
public void DoThis(int oldParameter) { }
public void DoThis(string newParameter) { }
这样做,因为返回类型不是签名的一部分:
public void DoThis(int oldParameter) { }
public int DoThis(int newParameter) { }
在该级别上没有任何后向兼容性。您无法将新旧混合在一起,而无需在不同的AppDomain
中加载旧版本。在创建某些内容之前,请三思而后行,并根据需要调整旧代码以适应新内容。
答案 2 :(得分:0)
方法名称不足以识别方法。
它的名称,返回类型和参数类型都定义了方法。
基本上:void Foo(int)
与void Foo(string)
或int Foo()
不同。
当多个方法具有相同的名称时,这些方法被视为重载,编译器将根据您传递的参数选择正确的方法。
在您的情况下,如果不使用旧方法,除了遗留代码,您不想重写,我建议您使用Obsolete
attribute。这将有助于开发人员通过在编译时生成警告来识别已弃用的方法(如果设置了标志,甚至是编译错误):
[Obsolete("Please use the 'void Foo(int, string)' overload"]
void Foo(int a){
// old code
}
void Foo(int a, string b) {
// new code
}