Visual Basic .NET Design-Time Breaking Changes
Short Description | it is invalid for a class to inherit from a class nested within it. This could occasionaly compile in 7.0 | ||||
Affected APIs | None. This is a change in the language limitations. Code that would sometimes compile will now never compile. | Severity | Low | Compat Switch Available | No |
|
|||||
Description | Class Derived inherits from a type nested within itself. This is a non-user-scenario and is forbidden in C#. Due to the way that decompilation within the VB background compiler works; it would only occasionally compile in VB7.0 and VB7.1. In 8.0 it would generate a compiler error. | ||||
|
|||||
User Scenario | Source upgrade scenarios. The user has defined a set of classes in V7.0 that depend on a class inheriting from a base type nested within itself. The project is then upgraded to VB.NET version 2.0. This is forbidden within the C# compiler. | ||||
|
|||||
Work Around | None. There would be no way to express it Visual Basic 8.0 that would compile. | ||||
Short Description | VB Err number returns 0 for COM exceptions with positive HResults instead of returning the HResult itself | ||||
Affected APIs | None | Severity | Low | Compat Switch Available | No |
|
|||||
Description | In VB6 the err number would be set to the HResult. In VB7 we assume that any positive value is a passing case and set the Err number to 0 even if an exception is thrown. | ||||
|
|||||
User Scenario | Upgraded applications that depend upon the Err number to handle errors will now handle error cases that would have previously been reported as successes. Applications that have used the workaround should continue to work as an exception will still be thrown and the underlying COM exception would continue to contain the correct HResult value. | ||||
|
|||||
Work Around | Catch the exception thrown and retreive the result from the exception properties. If On Error GoTo is being used for error handling; this would require an overhaul of the entire method's error handling as On Error GoTo is incompatible with structured error handling. | ||||
Short Description | VB collections had a weird implementation of IList: 0 based for read and -1 based for insertion | ||||
Affected APIs | none: Ilist implementation of VB collection is fixed | Severity | Low | Compat Switch Available | No |
|
|||||
Description | an instance of Collection type is casted to Ilist and then used via Ilist interface. To make this work in 7.0, 7.1 you would need to specialcase access to Ilist if it holds Collection | ||||
|
|||||
User Scenario | Upgraded apps that use VB Collection through inconsistent implementation of Ilist (very unlikely scenario) may be broken. | ||||
|
|||||
Work Around | code that has special-case warkarounds to use Collections casted to Ilist, will have to remove workarounds. | ||||
Short Description | Microsoft.VisualBasic.Collection - Remove( Key) behaves differently than vb6 | ||||
Affected APIs | none: implementation of VB collection is fixed | Severity | Low | Compat Switch Available | No |
|
|||||
Description | Removing the current element of a collection inside foreach would cause iterator to jump 2 elements. Now this is fixed. | ||||
|
|||||
User Scenario | Upgraded apps that remove elements from a VB Collection inside ForEach may be broken. | ||||
|
|||||
Work Around | Code that has workaround for old behavior now may be broken | ||||
Short Description | DirectCast gives error on statically invalid casts | ||||
Affected APIs | none : compiler rejects some code that would break at run time | Severity | Low | Compat Switch Available | No |
|
|||||
Description | some cases where code would 100% fail in run time are now compile errors. | ||||
|
|||||
User Scenario | some code that uses statically invalid DirectCast cases will not compile in version 2.0. The only case where this code would compile and not break in run time if this particular codepath is never used. | ||||
|
|||||
Work Around | once recompiling an app customer should remove/fix parts of the code with statically illegal usage of DirectCast. There is changes to the behavior of already compiled code | ||||
Short Description | latebound floating point compare against NaN Not Equal | ||||
Affected APIs | Source breaker only due to latebinding | Severity | Low | Compat Switch Available | No |
|
|||||
Description | Late bound/Early bound consistency. In the latebound case VB used to yeld Equal for floating poin numbers compared to NaN. In 8.0 this will yeld NotEqual to be consistent with earlybound case | ||||
|
|||||
User Scenario | comparing floating point numbers. This would return Equal if one of the numbers is NaN in 7.0. Customers are likely to have workarounds for this behavior. | ||||
|
|||||
Work Around | low impact. It is unlikely that any code could rely on this behavior. It is also should not break workarounds that could be added in 7.0 and 7.1 | ||||
Short Description | TypeName, SystemTypeName and VbTypeName are extended for unsigned types | ||||
Affected APIs | Source breaker only due to latebinding | Severity | Low | Compat Switch Available | No |
|
|||||
Description | in 8.0 VB fully supports unsigned numeric types. Different (more consistent) results should be yelded by TypeName, SystemTypeName and VbTypeName . | ||||
|
|||||
User Scenario | code that uses unsigned types and expects then not to be fully supported. | ||||
|
|||||
Work Around | it is unlikely that there is code that uses old limited support for unsigned types. In case it does, customer has to fix code to handle new behavior. | ||||
Short Description | And, Or, Xor call corresponding Iconvertible member for result type as other latebound operators do | ||||
Affected APIs | Source breaker only due to latebinding | Severity | Low | Compat Switch Available | No |
|
|||||
Description | In v1.1, when you perform latebound operations, the VB runtime calls through the IConvertible interface to extract the strongly-typed value that matches the result type of the expression. This was not the case for And, Or, Xor. In 8.0 the behavior of And, Or, Xor will be consistent with other operations. | ||||
|
|||||
User Scenario | latebound Xor, Or, Xor with resulting type not matching the type of operands may behave differently. | ||||
|
|||||
Work Around | Customer can add explicit conversions if he wants to convert to a different types than the runtime before doing actual And, Or, Xor operations | ||||
Short Description | (late bound byte - nothing) returns the same type as (nothing-byte) | ||||
Affected APIs | Source breaker only due to latebinding | Severity | Low | Compat Switch Available | No |
|
|||||
Description | Expected System.Byte on both earlybound and latebound casessimilar code in vb6 returns byte for both cases. A second argument for fixing this (apart that it's just plain wrong:)) is that it will avoid having similar behavior for the recently introduced unsigned types. | ||||
|
|||||
User Scenario | subtracting nothing from latebound byte | ||||
|
|||||
Work Around | New behavior is much more logical, however manual conversion of the operands is possible to keep old behavior. | ||||
Short Description | No difference between late and early bound evaluation of bitwise operators for string and boolean | ||||
Affected APIs | Source breaker only due to latebinding | Severity | Low | Compat Switch Available | No |
|
|||||
Description | The expression result in the latebinder is Long when it should be Boolean, just as the early-bound behavior. This bug is important to fix because it can cause subtle bugs when customers decide to make their program type-safe by turing Option Strict On. | ||||
|
|||||
User Scenario | late bound evaluation of bitwise operators for string and boolean | ||||
|
|||||
Work Around | New behavior is much more logical, however manual conversion of the operands is possible to keep old behavior. | ||||
Short Description | Intelligently emiting assembly references | ||||
Affected APIs | Source breaker because compile time feature | Severity | Low | Compat Switch Available | No |
|
|||||
Description | The proposed change (only emiting to the metadata references to assemblies that are used in the code) will cause a change in behavior on the System.Reflection.Assembly class, method GetReferencedAssemblies - this method lists the assemblies that are referenced, (provides information about the assemblies, not loaded assemblies). | ||||
|
|||||
User Scenario | This should only affect people who do not refer any types from the referenced assemblies and use the GetReferencedAssemblies method for some purpose, such as for example listing all the types in the referenced assemblies. | ||||
|
|||||
Work Around | GetReferencedAssemblies still works correctly. It just gives different results because we do not reference unused assemblies. It is unlikely that any workaround is needed while there are many obvious workarounds. | ||||
Short Description | Deal with namespace name case mismatch across referenced DLLs | ||||
Affected APIs | Namespace usage | Severity | Medium | Compat Switch Available | No |
|
|||||
Description |
If the names of two VB namespaces differ by case only, there is a new warning BC40055 about it, and C# app that referenced them using identifier of different case won't compile anymore. Example: In C# app referencing VB library: Ns.Class1 c1 = new Ns.Class1(); Ns.Class2 c2 = new Ns.Class2(); 'won't compileIn VB app:Namespace Ns Class Class1 End Class End Namespace Namespace ns 'causes compile warning Class Class2 end Class End namespace |
||||
|
|||||
User Scenario | Some apps that compiled against version 1.1 may fail to compile against version 2.0. | ||||
|
|||||
Work Around | Change the casing in the referencing application to match that in the declaration. | ||||
Short Description | VB compiler needs to change its typechecking to reflect that boxing a Nullable(Of T) results in a boxed T | ||||
Affected APIs | Nullable usage | Severity | Very Low | Compat Switch Available | No |
|
|||||
Description | Bug 531200 Creating a delegate with a function pointer to a member of a Nullable(Of T) fails verification. The following code should be a compile error.Module Module1 |
||||
|
|||||
User Scenario | This is a fit and finish issue that we won't be able to change once shipped due to compat reasons. | ||||
|
|||||
Work Around | If this not fixed you will get a null reference. | ||||