【发布时间】:2014-04-24 05:53:00
【问题描述】:
我们发现了一些我们无法解释的奇怪现象。在一个类中,我们有这两个函数:
Public Overloads Shared Function ToList(ByVal input As Object, _
Optional ByVal StringSeparator As String = ";", _
Optional ByVal CharacterCasing As String = "", _
Optional ByVal StartRow As Integer = 0, _
Optional ByVal EndRow As Integer = -1) As String
...
End Sub
Public Overloads Shared Function ToList(ByVal Input As Object, _
Optional ByVal SplitStringSeparator As String = ",", _
Optional ByVal JoinStringSeparator As String = ",", _
Optional ByVal PreFixStr As String = "", _
Optional ByVal PostFixStr As String = "") As String
...
End Sub
如果我们尝试在 VS2013 中编译这个项目,我们不会收到任何错误。如果我们尝试在 VS 2010 中编译这个完全相同的项目,它会给出以下错误(这是有道理的):
错误 1 '公共共享重载函数 ToList(输入为对象, [StringSeparator As String = ";"], [CharacterCasing As String = ""], [StartRow As Integer = 0]、[EndRow As Integer = -1]) As String' 和 '公共共享重载函数ToList(输入为对象, [SplitStringSeparator As String = ","], [JoinStringSeparator As String = ","], [PreFixStr As String = ""], [PostFixStr As String = ""]) As String' 不能互相重载,因为它们的区别仅在于 可选参数的默认值
错误 2 '公共共享重载函数 ToList(输入为对象, [StringSeparator As String = ";"], [CharacterCasing As String = ""], [StartRow As Integer = 0]、[EndRow As Integer = -1]) As String' 和 '公共共享重载函数ToList(输入为对象, [SplitStringSeparator As String = ","], [JoinStringSeparator As String = ","], [PreFixStr As String = ""], [PostFixStr As String = ""]) As String' 不能互相重载,因为它们的区别仅在于 可选参数的类型。
任何人都很好地解释了为什么在不同版本的 VS 中打开包含 SAME 项目的 SAME 解决方案时有时会出现错误有时不会出现差异?
【问题讨论】:
-
@lll - Roslyn 还没有发布,所以没有......
-
在 VS2013 中,如果调用不明确,则会在调用者中收到错误。例如,尝试调用
ToList(blah),您会看到以下内容:“重载解析失败,因为没有可访问的 'ToList' 最适合这些参数。”显然,只要您确保每个特定呼叫都明确无误,他们就希望允许这种情况。这仍然不能解释 如何 VS2010 和 VS2013 之间的这种行为会有所不同... -
@mellamokb 我也刚刚测试过,确认了.. 有趣的是,它似乎违反了spec,“重载类型的成员必须拥有唯一的签名。”和“方法的签名明确地不包括返回类型或参数修饰符,例如 Optional、ByRef 或 ParamArray。”
-
如果我从 VS2010 解决方案中的命令行手动调用
MSBuild,它构建得很好。所以它似乎是一个只存在于 VS2010 IDE 中的规则,它在 VS2013 中被删除。 编辑: 实际上,这只适用于同时安装了 VS2010 和 VS2013 的机器。在仅安装了 VS2010 的机器上,MSBuild 会生成相同的两个错误。因此,安装 VS2013 似乎包含一个与 VS2010 IDE 的行为不同的更新编译器! -
@lll - 这意味着他们在自己的开发中使用 Roslyn,而不是 Roslyn 在 VS2013 中.. Roslyn 还没有发布,而且根本不是在 2013 年......跨度>
标签: vb.net visual-studio-2010 visual-studio