나는 이것이 오래되었다는 것을 알고 있지만, 최근에는 선택되지 않은 C# 코드를 변환해야하고 어떻게했는지 공유 할 것이라고 생각했습니다. 순수한 VB 코드이며 범위가 필요할 수 있습니다 (프로젝트 전체 옵션이 아닌).
트릭은 Long 필드와 두 개의 정수 필드가 포함 된 구조를 만드는 것입니다. 그런 다음 StructLayout 및 FieldOffset 특성을 사용하여 긴 정수와 두 정수의 합집합을 만듭니다. 필드는 비공개가 될 수 있습니다. 확장 된 CType 연산자를 사용하여 Long에서 구조로, 구조에서 Integer로 변환합니다 (낮은 정수 값 사용). +, -, *, 등등에 대한 연산자 오버로드를 추가하고 presto! VB에서 검사되지 않은 산술!
정렬 ... 긴 값이 long의 범위를 벗어나면 Strilanc이 지적했듯이 여전히 오버플로됩니다. 그러나 검사되지 않은 많은 상황에서 잘 작동합니다.
다음은 예입니다 :
<StructLayout(LayoutKind.Explicit)>
Public Structure UncheckedInteger
<FieldOffset(0)>
Private longValue As Long
<FieldOffset(0)>
Private intValueLo As Integer
<FieldOffset(4)>
Private intValueHi As Integer
Private Sub New(newLongValue As Long)
longValue = newLongValue
End Sub
Public Overloads Shared Widening Operator CType(value As Long) As UncheckedInteger
Return New UncheckedInteger(value)
End Operator
Public Overloads Shared Widening Operator CType(value As UncheckedInteger) As Long
Return value.longValue
End Operator
Public Overloads Shared Widening Operator CType(value As UncheckedInteger) As Integer
Return value.intValueLo
End Operator
Public Overloads Shared Operator *(x As UncheckedInteger, y As Integer) As UncheckedInteger
Return New UncheckedInteger(x.longValue * y)
End Operator
Public Overloads Shared Operator Xor(x As UncheckedInteger, y As Integer) As UncheckedInteger
Return New UncheckedInteger(x.longValue Xor y)
End Operator
' Any other operator overload you need...
End Structure
이 같은 코드의 구조를 사용
Dim x As UncheckedInteger = 2147483647
Dim result As Integer = x * 2 ' This would throw OverflowException using just Integers
Console.WriteLine(result.ToString()) ' -2
주의하여 계산하지 않는 오버 플로우를 UncheckedInteger에 결과를 할당하기 전에. 동일한 기술을 사용하여 UncheckedShort 및 UncheckedByte 구조체를 생성 할 수 있습니다.
이 경우 추가 C# 어셈블리가 잔인 할 수도 있지만 C# 파일 (컴파일러의 일부 명령 줄 매개 변수)에서 모듈을 만든 다음 ILmerge를 사용하여 VB.NET 어셈블리와 병합 할 수도 있습니다. – OregonGhost