我正在将一些旧的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);
}
}
}
谢谢!
答案 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
,所以现在编译器无法在不同的情况下执行按位运算类型(int
和long
)