gpt4 book ai didi

c# - Visual Studio 2013和2015之间重载方法行为的更改

转载 作者:行者123 更新时间:2023-11-30 20:41:56 26 4
gpt4 key购买 nike

Visual Studio 2013和2015有很大的问题。在一个类中,我定义了以下两种方法:


public List<T> LoadData<T>(string connectionStringName = "", string optWherePart = "", params object[] parameter)
public List<T> LoadData<T>(string optWherePart, params object[] parameter)


我只想这样调用第二个方法:

....LoadData<Config_Info>("ConfigName LIKE 'Version' AND UserName LIKE '' AND PlugInName Like ?", parameter: ProductName);

如果我要在Visual Studio 2013中进行定义,则要进行第二个方法声明,但是在Visual Studio 2015中,我要进行第一个方法声明。两种解决方案都是
绝对相同。

即使编译结果是不同的,所以如果我使用VS 2015编译相同的解决方案,该程序将停止工作。

这是一个非常奇怪的行为。

有谁有主意,区别是什么?

最佳答案

这是基于C#5规范的,但是由于C#6规范似乎尚未发布,所以这是我能做的最好的事情。这也是引用坎宁安定律的一种尝试。



首先,以规范的s7.5.3.1(“适用的功能成员”)的语言,两个功能成员都可以以其扩展形式(以下简称“ params object[]无法由string ProductName满足,因此将其转换为object参数。

因此,我们继续进行s7.5.3.2(“更好的函数成员”)的决定,以决定两者中哪个更好。



首先,构造一个精简的参数列表A,其中仅包含参数表达式本身,并且它们在原始参数列表中的出现顺序为:


{ string "ConfigName [...]", string ProductName }


接下来,以以下方式构造每个候选函数成员的[p]参数列表:


如果功能成员仅适用于扩展形式,则使用扩展形式。
没有相应参数的可选参数将从参数列表中删除
对参数进行重新排序,以便它们出现在参数列表中与相应参数相同的位置。


这给我们以下内容:


{ string connectionStringName, object parameter }(已删除optWherePart,已扩展params
{ string optWherePart, object parameter }params展开)


然后,我们要进行一系列比较,以决定哪个是更好的功能成员。分别调用一个Mp和一个Mq,如下所示:


如果Mp是非泛型方法,而Mq是泛型方法,则Mp优于Mq


这里没什么区别

否则,如果Mp以其正常形式适用且Mq具有params数组且仅以其扩展形式适用,则Mp优于Mq


这里没有区别;两者都处于扩展形式

否则,如果Mp的声明参数多于Mq,则Mp优于Mq。如果这两种方法都具有params数组并且仅以其扩展形式适用,则可能会发生这种情况。


这不是100%。我们的两个参数列表都使用原始函数定义中的2个参数。我认为,这仅是为了区分两种情况都进入同一个params数组的情况,一种情况是其中一种进入该数组,另一种情况进入普通参数。

否则,如果Mp的所有参数都有对应的参数,而默认参数需要替换Mq中的至少一个可选参数,则Mp优于Mq


啊哈!我们的第一个参数列表缺少optWherePart,它需要一个默认参数,因此第二个参数列表更好!所以VS2015错了!



... 可是等等。最后一颗子弹是什么意思? MpMq是专门的参数列表,其中删除了没有相应参数的[o]可选参数。他们中的任何一个都不可能有相应的参数,因为如果没有,则将其删除。



总之,我无法确定这是旧编译器,新编译器还是C#规范中的错误。

我发现blog postSLaks似乎也认为旧行为是一个错误。该博客指出Roslyn已通过使编译器失败来解决此问题,这不再是我所看到的。也许他们改变了主意?



编辑:更新!我的Roslyn bug report导致了change to the compiler,以确保在这种情况下,选择了第二个重载。这似乎是由于默认参数需要在上面替换措词。我仍然认为规范是模棱两可的,因此令我失望的是仅进行了代码更改(而不是规范更改,甚至没有讨论为什么第二个重载更好的原因),但是至少VS2015运行时的特性是现在与VS2013中的相同。

关于c# - Visual Studio 2013和2015之间重载方法行为的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31877169/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com