2016-02-05 73 views
0

我正在做一些舊的VB代碼轉換爲C#。轉換幾個屬性時出現此錯誤。運營商'!'不能應用於long類型的操作數

「Operator'!'不能應用於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 

這是轉換它時的樣子。這兩個設置條件是我得到這個錯誤的地方。 The Or |我可以改爲鑄造(int)並且錯誤消失,但在其他情況下不確定如何調整?

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); 
      } 
     } 
    } 

謝謝!

+3

此轉換器做怪異的東西做的位操作,整數值上的'Not'應該被解釋爲一個按位否定,對此''''是正確的運算符。 –

+0

@MaximilianGerhardt:你應該寫這個答案 - 這是絕對正確的。 –

+0

檢查以下鏈接:https://msdn.microsoft.com/en-us/library/2cwcswt4.aspx,該部分包含:對於數字表達式... –

回答

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的,所以現在的編譯器希望不compain關於不同類型(intlong

相關問題