2016-04-10 9 views
1

私は、次の生産しているのC#に変換VB.Netで書かれたレガシー・コードの一部コピーしたCまで:それは投げている非NULL可能型変換の問題vb.netを変換できません#

///<summary> 
    ///Test whether SSAC should be serialized 
    ///</summary> 
    public virtual bool ShouldSerializeSSAC() 
    { 
     if (_shouldSerializeSSAC) 
     { 
      return true; 
     } 
     return (_sSAC != (SSAC_Type)null); 
    } 

それがnullでない型であるため変換できないことを示すエラー。次のようにSSACのコードは次のとおりです。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 

次のように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#コードを更新しますか?

答えて

2

VBコードでは意図しない動作だった可能性があるので、「修正」はここで使用するのに最適な用語ではないかもしれません。しかし、もし "修正"すれば、どのように同じように動作させるのですか?その答えは、C#コードが(_sSAC != SSAC_Type.A)を返さなければならないということです。実際にそれを訂正するには、_sSACSSAC_Type?(NULL入力可能)と宣言してください。_sSAC.HasValueを返すことができます。 VBで動作した理由は、VBのNothingがC#のnullとまったく同じではないためです。 Nothingは、列挙インスタンスに適用されたとき整数を、列挙のように、デフォルトは0

+0

これはリターン(!_sSAC =(SSAC_Type)ヌル)ことを意味しません。常にenumリストの最初のオブジェクトを返しますか? – Jay

+0

いいえブール値を返します。 _ssacがA(0)と等しくなければ真を返します。 –

+0

OK SSAC_Typeをどこで設定できるのか分かりますか? nullableとして、_sSAC.HasValueを返すことに関してはどういう意味ですか?私はHasFlagだけHasValueメソッドを見ることができません – Jay

0

「何」ではないので、実際には、任意のタイプのデフォルト値を意味常にVBに「0」であるかどうか、又はenumの最初の値が明示的に他の値に設定されているわけではありません。つまり、enumの実際の最初の値は無関係です。 は、だからあなたのメソッドのC#と同等である:

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

    return (_sSAC != 0); 
} 
+0

ありがとうDave iveは変数をnullableに変更し、_sSAC.HasValueを返すようにしました – Jay