2009-06-09 9 views
1

J'ai fait la déclaration suivante:nullables énumérations (??) et LinqToSQL

select new Action { 
    ParentContentType = action.ParentContentType != null ? (ContentType)Enum.ToObject(typeof(ContentType), action.ParentContentType) : null 
}; 

ParentContentType est un ENUM annulable de type ContentType

cartes de action.ParentContentType à une table de base de données qui est un nullable int.

Si action.ParentContentType isnt null, je déterminer la valeur ENUM en utilisant:

(ContentType)Enum.ToObject(typeof(ContentType), action.ParentContentType) 

Dans le cas où action.ParentContentType EST null J'essaie de régler le ENUM annulable à la valeur null .

Ce ne marche pas et je reçois la compilation:

Error 1 Type of conditional expression cannot be determined because there is no implicit conversion between ContentType' and '<null>' 

EDIT

Je pourrais créer une valeur ENUM nulle .. par exemple ContentType.EMPTY.

Cependant:

ParentContentType = action.ParentContentType == null? ContentType.EMPTY: (ContentType) Enum.ToObject (typeof (ContentType), action.ParentContentType) };

Ne fonctionne pas non plus!

je reçois l'exception:

The argument 'value' was the wrong type. Expected 'Enums.ContentType'. Actual 'System.Object'. 

Répondre

2

Je voudrais aller avec votre idée de ContentType.Null ou ContentType.Empty sinon vous vérifieront pour nulls tout au long de votre application ... plus ContentType.Empty est plus descriptif.

0

null est non typée. Vous devez le lancer explicitement parce que le? L'opérateur en C# exige que le second argument soit du même type (ou implicitement convertible) que le premier.

Parce que les deux doivent être du même type, et null ne peut pas être jeté à un type de valeur, ils tous deux doivent du type nullable:

select new Action { 
    ParentContentType = action.ParentContentType != null ? 
    (ContentType?)Enum.ToObject(typeof(ContentType), action.ParentContentType) : 
    (ContentType?)null 
}; 

Cependant, cela est assez obscur. Il ne m'est même jamais venu à l'esprit que vous pouviez créer une énumération nulle (je suppose que vous le pouvez, puisque vous avez posté la question - je n'ai jamais essayé).

Vous serez probablement mieux avec une valeur enum qui signifie «rien», comme vous l'avez suggéré. Ce serait moins surprenant pour la plupart des développeurs. Vous ne vous attendez pas à ce qu'un enum soit nul.

+0

En fait, dans ce cas, le lancement de la valeur null entraînera une exception "Impossible de traduire l'expression"! – iasksillyquestions

+0

C'est bizarre. Le code ci-dessus compilé et a couru pour moi. Pouvez-vous poster la définition du type de ParentContentType? –

1

Bizarrement:

ParentContentType = action.ParentContentType == null ? ContentType.EMPTY : (ContentType)Enum.ToObject(typeof(ContentType), action.ParentContentType) 

résultats à une exception:

The argument 'value' was the wrong type. Expected 'Enums.ContentType'. Actual 'System.Object'. 

WTF?

+0

Well est ParentContentType une énumération aussi? Alors devrait-il avoir un ContentType.Empty? – bytebender

+0

action.ParentContentType est un entier nul et provient de la base de données – iasksillyquestions

+0

Cependant, la valeur dans la base de données ne doit jamais être == null. DOh! – iasksillyquestions