Visual Studio 2010与Visual Studio 2013 - 不同的编译器错误 - 为什么?

Den*_*nis 4 vb.net visual-studio-2010 visual-studio

我们注意到一些我们无法解释的奇怪事 在课堂上我们有这两个功能:

   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
Run Code Online (Sandbox Code Playgroud)

如果我们尝试在VS2013中编译这个项目,我们不会收到任何错误.如果我们尝试在VS 2010中编译同一个完全相同的项目,则会出现以下错误(这是有道理的):

错误1'公共共享重载函数ToList(输入为对象,[StringSeparator为String =";"],[CharacterCasing As String =""],[StartRow As Integer = 0],[EndRow As Integer = -1])As字符串'和'公共共享重载函数ToList(作为对象输入,[SplitStringSeparator As String =","],[JoinStringSeparator As String =","],[PreFixStr As String =""],[PostFixStr As String ="" ])因为String'不能相互重载,因为它们只有可选参数的默认值不同

错误2'公共共享重载函数ToList(输入为对象,[StringSeparator为String =";"],[CharacterCasing As String =""],[StartRow As Integer = 0],[EndRow As Integer = -1])As字符串'和'公共共享重载函数ToList(作为对象输入,[SplitStringSeparator As String =","],[JoinStringSeparator As String =","],[PreFixStr As String =""],[PostFixStr As String ="" ])因为String'不能相互重载,因为它们只有可选参数的类型不同.

任何人都有一个很好的解释,为什么在不同版本的VS中打开包含SAME项目的SAME解决方案时会出现差异,有时会出错,有时不会出错?

Han*_*ant 6

查看通过参考源可用的编译器源代码,我认为我认为它接受第二个函数作为有效的重载,因为默认值具有不同的类型.你可以看看自己,vb\language\compiler\symbols\symboltable.cpp,BCSYM :: CompareParams()函数.

    // make sure the types being used for the default are the same
    if ( ParmTypeCompareFlags & ( EQ_Shape | EQ_GenericTypeParams ))
    {
        ComparisonFlags |= EQ_OptionalTypes;

        // don't percolate the difference in the type shape on in this case - the difference we care about it is EQ_OptionalTypes
        ParmTypeCompareFlags &= ~(EQ_Shape | EQ_GenericTypeParams);   // <== Here
    }
Run Code Online (Sandbox Code Playgroud)

关闭EQ_Shape是错误,表示参数不同.我无法将它与在VS2010中完成的方式进行比较,该版本不可用.

这当然没有意义.它违反了语言规范的第4.1.1章,其中说:

具有可选参数的方法被认为具有多个签名,每个签名对应于可由调用者传入的每组参数.例如,以下方法有三个相应的签名:

Sub F(x As Short,_
Optional y As Integer = 10,_
Optional z As Long = 20)

这些是方法的签名:
•F(短)
•F(短,整数)
•F(短,整数,长)

所以我觉得你发现了一个bug.这是一个温和的,它无论如何在呼叫站点得到解决,你会得到错误BC30521,"重载分辨率失败".您可以在connect.microsoft.com上报告