Skip to content

Commit e596227

Browse files
Numeric types use a separate bitwise negation operator in C#
1 parent 976fe55 commit e596227

2 files changed

Lines changed: 15 additions & 0 deletions

File tree

CodeConverter/CSharp/ExpressionNodeVisitor.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -659,6 +659,12 @@ public override async Task<CSharpSyntaxNode> VisitUnaryExpression(VBasic.Syntax.
659659
if (kind == SyntaxKind.LogicalNotExpression && await NegateAndSimplifyOrNullAsync(node, expr) is { } simpleNegation) {
660660
return AsBool(node, simpleNegation);
661661
}
662+
663+
if (kind == SyntaxKind.LogicalNotExpression &&
664+
_semanticModel.GetTypeInfo(node.Operand).ConvertedType is {} t &&
665+
(t.IsNumericType() || t.IsEnumType())) {
666+
csTokenKind = SyntaxKind.TildeToken;
667+
}
662668
return SyntaxFactory.PrefixUnaryExpression(
663669
kind,
664670
SyntaxFactory.Token(csTokenKind),

Tests/TestData/SelfVerifyingTests/VBToCS/EnumTests.vb

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,4 +67,13 @@ Public Class EnumTests
6767
Dim s As String = RankEnum.Second
6868
Assert.Equal(s & RankEnum.Second, "22")
6969
End Sub
70+
71+
<Fact>
72+
Public Sub NegatedEnumNegatesUnderlyingNumber()
73+
Dim initialEnum = RankEnum.First Or RankEnum.Second
74+
Dim withSecondRemoved = initialEnum And Not RankEnum.Second
75+
Dim i As RankEnum = (1 Or 2) And Not 2
76+
Assert.Equal(withSecondRemoved, i)
77+
Assert.Equal(withSecondRemoved, RankEnum.First)
78+
End Sub
7079
End Class

0 commit comments

Comments
 (0)