Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions CodeConverter/CSharp/TypeConversionAnalyzer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,11 @@ public TypeConversionKind AnalyzeConversion(VBSyntax.ExpressionSyntax vbNode, bo
if (vbConvertedType.SpecialType == SpecialType.System_String) {
return TypeConversionKind.EnumCastThenConversion;
}

if (!vbConvertedType.IsEnumType() && !ExpressionEvaluator.ConversionsTypeFullNames.ContainsKey(vbConvertedType.GetFullMetadataName())) {
return TypeConversionKind.EnumCastThenConversion;
}

return TypeConversionKind.Conversion;
}

Expand Down
97 changes: 96 additions & 1 deletion Tests/CSharp/ExpressionTests/ExpressionTests.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using System.Threading.Tasks;
using System.Threading.Tasks;
using ICSharpCode.CodeConverter.Tests.TestRunners;
using Xunit;

Expand Down Expand Up @@ -2929,6 +2929,101 @@ public object Edit(bool flag2 = false, CrashEnum? crashEnum = default)
}
return null;
}
}");
}
[Fact]
public async Task Issue1211_EnumToCustomTypeImplicitConversionAsync()
{
await TestConversionVisualBasicToCSharpAsync(
@"Public Class Class1
Enum MyEnum
Value1 = 1
End Enum

Public Structure MyType
Public val As Integer
Public Shared Widening Operator CType(ByVal p As Integer) As MyType
Return New MyType With {.val = p}
End Operator
Public Shared Operator =(ByVal p As MyType, ByVal q As MyType) As Boolean
Return p.val = q.val
End Operator
Public Shared Operator <>(ByVal p As MyType, ByVal q As MyType) As Boolean
Return p.val <> q.val
End Operator
End Structure

Public Function Col(name As String) As MyType
Return Nothing
End Function

Public Sub Foo()
Dim b = Col(""foo"") = MyEnum.Value1
End Sub
End Class",
@"
public partial class Class1
{
public enum MyEnum
{
Value1 = 1
}

public partial struct MyType
{
public int val;
public static implicit operator MyType(int p)
{
return new MyType() { val = p };
}
public static bool operator ==(MyType p, MyType q)
{
return p.val == q.val;
}
public static bool operator !=(MyType p, MyType q)
{
return p.val != q.val;
}
}

public MyType Col(string name)
{
return default;
}

public void Foo()
{
bool b = Col(""foo"") == (MyType)(int)MyEnum.Value1;
}
}");
}

[Fact]
public async Task EnumToBooleanAsync()
{
await TestConversionVisualBasicToCSharpAsync(
@"Public Class C
Public Sub M(e As ESByte)
Dim vBooleanSByte As Boolean = e
End Sub
End Class

Public Enum ESByte As Long
M1 = 1
End Enum",
@"using Microsoft.VisualBasic.CompilerServices; // Install-Package Microsoft.VisualBasic

public partial class C
{
public void M(ESByte e)
{
bool vBooleanSByte = Conversions.ToBoolean(e);
}
}

public enum ESByte : long
{
M1 = 1L
}");
}
}
Loading