接线员'!'无法应用于long

时间:2016-02-05 17:57:46

标签: c# vb.net operators boolean-logic

我正在将一些旧的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);
            }
        }
    }

谢谢!

1 个答案:

答案 0 :(得分: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,所以现在编译器无法在不同的情况下执行按位运算类型(intlong