无法将不可为null的类型转换问题vb.net转换为c#

无法将不可为null的类型转换问题vb.net转换为c#,c#,vb.net,enums,non-nullable,C#,Vb.net,Enums,Non Nullable,我复制了一段用VB.Net编写的遗留代码,该代码在转换为C#时产生以下结果: ///<summary> ///Test whether SSAC should be serialized ///</summary> public virtual bool ShouldSerializeSSAC() { if (_shouldSerializeSSAC) { return true;

我复制了一段用VB.Net编写的遗留代码,该代码在转换为C#时产生以下结果:

///<summary>
    ///Test whether SSAC should be serialized
    ///</summary>
    public virtual bool ShouldSerializeSSAC()
    {
        if (_shouldSerializeSSAC)
        {
            return true;
        }
        return (_sSAC != (SSAC_Type)null);
    }
///
///测试是否应序列化SSAC
///
公共虚拟bool应序列化ssac()
{
如果(_shouldsac)
{
返回true;
}
返回(_-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
}
Public Overridable Function ShouldSerializeSSAC() As Boolean
        If _shouldSerializeSSAC Then
            Return True
        End If
        Return (_sSAC <> CType(Nothing, SSAC_Type))
    End Function
 <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
[System.CodeDom.Compiler.GeneratedCodeAttribute(“System.Xml”,“4.6.81.0”),System.SerializableAttribute()]
公共枚举SSAC_类型
{
///
A.
///
B
///
C
///
D
///
E
///
F
///
G
///
H
///
J
}
在VB.Net中,此函数如下所示:

[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
}
Public Overridable Function ShouldSerializeSSAC() As Boolean
        If _shouldSerializeSSAC Then
            Return True
        End If
        Return (_sSAC <> CType(Nothing, SSAC_Type))
    End Function
 <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
公共可重写函数应将sac()序列化为布尔值
如果(你应该)那么
返回真值
如果结束
返回(_SSACCTYPE(无,sSAC_类型))
端函数
而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
}
Public Overridable Function ShouldSerializeSSAC() As Boolean
        If _shouldSerializeSSAC Then
            Return True
        End If
        Return (_sSAC <> CType(Nothing, SSAC_Type))
    End Function
 <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

公共枚举SSAC_类型
'''
A.
'''
B
'''
C
'''
D
'''
E
'''
F
'''
G
'''
H
'''
J
结束枚举

如何更新C代码以修复此错误?

好吧,这里使用“修复”可能不是最好的术语,因为这可能是VB代码中的意外行为。但是,如果说“fix”,您的意思是,如何使其工作相同,那么答案是C代码应该返回
(_sSAC!=sSAC_Type.A)
。要真正更正它,
sSAC
应该声明为
sSAC\u Type?
(可为空),然后您可以只返回
sSAC.HasValue
。它在VB中工作的原因是,VB中的
Nothing
与C#中的
null
并不完全等价
Nothing
实际上表示任何给定类型的默认值,因此对于整数(如枚举),默认值为0

“Nothing”在VB中应用于枚举实例时始终为“0”,无论枚举的第一个值是否显式设置为其他值。也就是说,枚举的实际第一个值是不相关的。 因此,与您的方法等效的C#是:

public virtual bool ShouldSerializeSSAC()
{
    if (_shouldSerializeSSAC)
        return true;

    return (_sSAC != 0);
}

这是否意味着返回(_-sSAC!=(sSAC_-Type)null);是否始终返回枚举列表中的第一个对象?否。它返回布尔值。如果_ssac不等于A(0),它将返回true。好的,我可以在哪里设置ssac_类型?作为可空值,返回sSAC.HasValue意味着什么?我看不到HasValue方法,只能看到HasFlag。我只是猜测这就是代码打算做的事情,但没有成功。我认为你需要决定的问题是VB试图做什么,以及你希望它做什么。这简直是胡说八道。因此,您需要决定它是应该检查零值,还是重写整个过程,使_sSac可以为空。与其说是翻译的问题,不如说是决定你需要什么并相应地编写。谢谢Dave,我选择将变量更改为可为null并返回_sSAC.HasValue