6
votes

Comment éviter "Source! = NULL" Lorsque vous utilisez des contrats de code et LINQ vers SQL?

J'ai le code suivant à l'aide d'un contexte de données normal qui fonctionne bien: xxx pré>

Cependant, lorsque je convertit le filtre en une méthode de poste comme suit: P>

var dc = new myDataContext();
Contract.Assume(dc.Cars!= null);
var cars = dc.Cars.WithOwner('Jim');

public static IQueryable<Car> WithOwner(this IQueryable<Car> cars, string owner)
{
    Contract.Requires(cars != null);
    return cars.Where(c => c.Owner == owner);
}


0 commentaires

4 Réponses :


1
votes

Je suppose que votre avertissement est causé par le paramètre propriétaire, plutôt que les voitures. Ajoutez une condition préalable dans la méthode de la clienter pour vérifier si le propriétaire n'est pas NULL.

public static IQueryable<Car> WithOwner(IQueryable<Car> cars, string owner)
{
    Contract.Requires(cars != null);
    Contract.Requires(!string.isNullOrEmpty(owner));
    return cars.Where(c => c.Owner = owner);
}


2 commentaires

De plus, si vous regardez vos messages, les contrats de code pourraient suggérer cette (ou une autre) condition préalable automatiquement.


Douteux. Il n'y a aucune raison de se plaindre d'un null propriétaire. Mon pari est sur c == null , c'est-à-dire qu'il n'est pas garanti que tous les éléments de voitures ne sont pas nuls.



0
votes

Je me demande comment vous obtenez le code compilé avec la méthode d'extension car vous manquez CE CODE> STROND> Mot clé de votre méthode Signature.

public static IQueryable<Car> WithOwner(this IQueryable<Car> cars, string owner)
{
    ...
}


0 commentaires

0
votes

Il est possible que votre extrait de code ne décrit pas complètement le code que vous utilisez.

Considérez cet extrait à la place: P>

Contract.Ensures(Contract.Result<IQueryable<Car>>() != null);


0 commentaires

0
votes

Nous avons résolu cela quelques versions de quelques versions. L'avertissement était dû à certains contrats manquants autour de la construction d'expression Linq, etc. Les méthodes d'expression LINQ ont des contrats et le compilateur C # génère un code qui appelle ces méthodes. Si nous n'avons pas assez de conditions de poste sur les méthodes appelées, vous pouvez obtenir ces avertissements cryptiques sur le code que vous ne savez même pas est là (sauf si vous avez l'air avec ildasme).


0 commentaires