1

我复制了一段用 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 的代码如下:

[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 类如下:

 <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# 代码以修复此错误?

4

2 回答 2

2

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

于 2016-04-10T19:13:21.200 回答
0

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

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

    return (_sSAC != 0);
}
于 2016-04-10T20:01:03.857 回答