2016-04-10 2 views
1

Я скопировал часть унаследованного кода, написанного в VB.Net, которые при преобразовании в 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); 
    } 

Он бросает ошибка, заявляющая, что она не может преобразовать, потому что она является типом с нулевым значением. Код для ГКПС выглядит следующим образом:

[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 

Хотя класс ГКПС был следующим:

<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). Чтобы на самом деле исправить это, _sSAC должен быть объявлен как SSAC_Type? (nullable), то вы можете просто вернуть _sSAC.HasValue. Причина, по которой он работал в VB, состоит в том, что Nothing в VB не совсем эквивалентен null в C#. Nothing фактически означает значение по умолчанию для любого заданного типа, так и для целого, как перечисление, по умолчанию не равен 0.

+0

Означает ли это, что возвращение (_sSAC = (SSAC_Type) нуль!); всегда возвращает первый объект в списке перечислений? – Jay

+0

Нет. Он возвращает логическое значение. Он возвращает true, если _ssac не равен A (0). –

+0

OK Я вижу, где я могу установить SSAC_Type? как обнуляемый, что вы имеете в виду в отношении возврата _sSAC.HasValue? Я не вижу метод HasValue только для HasFlag – Jay

0

«Nothing», когда применяется к экземпляру перечислений всегда «0» в VB, или не первое значение перечисления явно установлено на что-либо еще. То есть, фактическое первое значение перечисления не имеет значения. Таким образом, C# эквивалент вашего метода:

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

    return (_sSAC != 0); 
} 
+0

спасибо, что Dave ive выбрал замену переменных на nullables и возвращает _sSAC.HasValue – Jay