Оператор '!' не может применяться к операнду типа long

Я делаю некоторую конверсию старого кода VB в C #. Я получаю эту ошибку при преобразовании нескольких свойств.

«Оператор»! не может применяться к операнду типа long "

Вот как выглядит код VB, и мы надеемся на некоторую помощь с этим.

Public Property Value() As Integer
    Get
        If (Me.m_Value < 32768) Then
            Return Me.m_Value
        Else
            Return -32768 + (Me.m_Value - 32768)
        End If
    End Get
    Set(ByVal PLCValue As Integer)
        Me.m_Value = PLCValue
    End Set
End Property

Public Property B0() As Boolean
    Get
        If ((Me.m_Value And &H1&) = &H1&) Then
            Return True
        Else
            Return False
        End If
    End Get
    Set(ByVal State As Boolean)
        If (State = True) Then
            Me.m_Value = Me.m_Value Or &H1&
        Else
            Me.m_Value = Me.m_Value And (Not &H1&)
        End If
    End Set
End Property
Public Property B1() As Boolean
    Get
        If ((Me.m_Value And &H2&) = &H2&) Then
            Return True
        Else
            Return False
        End If
    End Get
    Set(ByVal State As Boolean)
        If (State = True) Then
            Me.m_Value = Me.m_Value Or &H2&
        Else
            Me.m_Value = Me.m_Value And (Not &H2&)
        End If
    End Set
End Property

Вот как это выглядит при преобразовании. Я получаю эту ошибку в обоих установленных условиях. Ор | Я могу перейти на приведение к (int), и ошибка исчезнет, ​​но не уверен в условии else, как это исправить?

public int Value
    {
        get
        {
            if ((_value < 32768))
            {
                return _value;
            }
            else
            {
                return -32768 + (_value - 32768);
            }
        }
        set { _value = value; }
    }

    public bool B0
    {
        get
        {
            if (((_value & 0x1L) == 0x1L))
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        set
        {
            if ((value == true))
            {
                _value = _value | 0x1L;
            }
            else
            {                    
                _value = _value & (!0x1L); 
            }
        }
    }
    public bool B1
    {
        get
        {
            if (((_value & 0x2L) == 0x2L))
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        set
        {
            if ((value == true))
            {
                _value = _value | 0x2L;
            }
            else
            {
                _value = _value & (!0x2L);
            }
        }
    }

Спасибо!


person S. Scott    schedule 05.02.2016    source источник
comment
Этот преобразователь делает странные вещи, Not в целочисленном значении следует интерпретировать как побитовое отрицание, для которого ~ является правильным оператором.   -  person Maximilian Gerhardt    schedule 05.02.2016
comment
@MaximilianGerhardt: вы должны написать это как ответ - это абсолютно правильно.   -  person Dave Doknjas    schedule 05.02.2016
comment
Проверьте следующую ссылку: msdn.microsoft.com/en-us/library/2cwcswt4 .aspx, часть с: Для числовых выражений ...   -  person Mat-Tap    schedule 05.02.2016
comment
Похоже, это было оно! Я посмотрел на то, что вы сказали, но, очевидно, я не сложил 2 и 2 вместе! Спасибо!   -  person S. Scott    schedule 05.02.2016


Ответы (1)


Полный код, надеюсь, правильный:

public int Value
    {
        get
        {
            if ((_value < 32768))
            {
                return _value;
            }
            else
            {
                return -32768 + (_value - 32768);
            }
        }
        set { _value = value; }
    }

    public bool B0
    {
        get
        {
            if (((_value & 0x1) == 0x1))
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        set
        {
            if ((value == true))
            {
                _value = _value | 0x1;
            }
            else
            {                    
                _value = _value & (~0x1); 
            }
        }
    }
    public bool B1
    {
        get
        {
            if (((_value & 0x2) == 0x2))
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        set
        {
            if ((value == true))
            {
                _value = _value | 0x2;
            }
            else
            {
                _value = _value & (~0x2);
            }
        }
    }

Как я указал в своем комментарии и был подтвержден ссылкой @mataps, Not в числовом значении следует интерпретировать как побитовое отрицание ~ в C #. Кроме того, я повсюду отбросил литерал L, потому что Value относится к типу int, а не long, поэтому теперь компилятор, надеюсь, не соглашается выполнять побитовые операции с разными типами (int и long)

person Maximilian Gerhardt    schedule 05.02.2016