Cannot convert non-nullable type conversion问题vb.net to c#
Cannot convert non-nullable type conversion problems vb.net to c#
我复制了一段用 VB.Net 编写的遗留代码,当转换为 C# 时产生了以下内容:
///<summary>
///Test whether SSAC should be serialized
///</summary>
public virtual bool ShouldSerializeSSAC()
{
if (_shouldSerializeSSAC)
{
return true;
}
return (_sSAC != (SSAC_Type)null);
}
它抛出一个错误,指出它不能转换,因为它是一个不可为 null 的类型。 SSAC的代码如下:
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.6.81.0"), System.SerializableAttribute()]
public enum SSAC_Type
{
///<remarks/>
A,
///<remarks/>
B,
///<remarks/>
C,
///<remarks/>
D,
///<remarks/>
E,
///<remarks/>
F,
///<remarks/>
G,
///<remarks/>
H,
///<remarks/>
J
}
在VB.Net中这个函数如下:
Public Overridable Function ShouldSerializeSSAC() As Boolean
If _shouldSerializeSSAC Then
Return True
End If
Return (_sSAC <> CType(Nothing, SSAC_Type))
End Function
虽然 SSAC class 如下:
<System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.6.81.0"),
System.SerializableAttribute()>
Public Enum SSAC_Type
'''<remarks/>
A
'''<remarks/>
B
'''<remarks/>
C
'''<remarks/>
D
'''<remarks/>
E
'''<remarks/>
F
'''<remarks/>
G
'''<remarks/>
H
'''<remarks/>
J
End Enum
如何更新 C# 代码来修复此错误?
嗯,"fix" 可能不是在这里使用的最佳术语,因为它可能是 VB 代码中的意外行为。但是,如果 "fix",你的意思是,如何使它工作相同,那么答案是 C# 代码应该 return (_sSAC != SSAC_Type.A)
。要实际更正它,_sSAC
应该声明为 SSAC_Type?
(可为空),然后您可以 return _sSAC.HasValue
。它在 VB 中起作用的原因是因为 VB 中的 Nothing
并不完全等同于 C# 中的 null
。 Nothing
实际上意味着任何给定类型的 默认 值,因此对于整数,如枚举,默认值为 0。
'Nothing' 应用于枚举实例时,在 VB 中始终为“0”,无论枚举的第一个值是否明确设置为其他任何值。也就是说,枚举的实际第一个值是无关紧要的。
因此,与您的方法等效的 C# 是:
public virtual bool ShouldSerializeSSAC()
{
if (_shouldSerializeSSAC)
return true;
return (_sSAC != 0);
}
我复制了一段用 VB.Net 编写的遗留代码,当转换为 C# 时产生了以下内容:
///<summary>
///Test whether SSAC should be serialized
///</summary>
public virtual bool ShouldSerializeSSAC()
{
if (_shouldSerializeSSAC)
{
return true;
}
return (_sSAC != (SSAC_Type)null);
}
它抛出一个错误,指出它不能转换,因为它是一个不可为 null 的类型。 SSAC的代码如下:
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.6.81.0"), System.SerializableAttribute()]
public enum SSAC_Type
{
///<remarks/>
A,
///<remarks/>
B,
///<remarks/>
C,
///<remarks/>
D,
///<remarks/>
E,
///<remarks/>
F,
///<remarks/>
G,
///<remarks/>
H,
///<remarks/>
J
}
在VB.Net中这个函数如下:
Public Overridable Function ShouldSerializeSSAC() As Boolean
If _shouldSerializeSSAC Then
Return True
End If
Return (_sSAC <> CType(Nothing, SSAC_Type))
End Function
虽然 SSAC class 如下:
<System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.6.81.0"),
System.SerializableAttribute()>
Public Enum SSAC_Type
'''<remarks/>
A
'''<remarks/>
B
'''<remarks/>
C
'''<remarks/>
D
'''<remarks/>
E
'''<remarks/>
F
'''<remarks/>
G
'''<remarks/>
H
'''<remarks/>
J
End Enum
如何更新 C# 代码来修复此错误?
嗯,"fix" 可能不是在这里使用的最佳术语,因为它可能是 VB 代码中的意外行为。但是,如果 "fix",你的意思是,如何使它工作相同,那么答案是 C# 代码应该 return (_sSAC != SSAC_Type.A)
。要实际更正它,_sSAC
应该声明为 SSAC_Type?
(可为空),然后您可以 return _sSAC.HasValue
。它在 VB 中起作用的原因是因为 VB 中的 Nothing
并不完全等同于 C# 中的 null
。 Nothing
实际上意味着任何给定类型的 默认 值,因此对于整数,如枚举,默认值为 0。
'Nothing' 应用于枚举实例时,在 VB 中始终为“0”,无论枚举的第一个值是否明确设置为其他任何值。也就是说,枚举的实际第一个值是无关紧要的。 因此,与您的方法等效的 C# 是:
public virtual bool ShouldSerializeSSAC()
{
if (_shouldSerializeSSAC)
return true;
return (_sSAC != 0);
}