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# 中的 nullNothing 实际上意味着任何给定类型的 默认 值,因此对于整数,如枚举,默认值为 0。

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

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

    return (_sSAC != 0);
}