Pourquoi je ne peux pas comparer un KeyValuePair<TKey, TValue> à défaut

Dans .Net de 2,5 je peux habituellement obtenir une comparaison d'égalité (==) entre une valeur et son type par défaut

if (myString == default(string))

Mais j'ai l'exception suivante lorsque j'essaie d'exécuter une comparaison d'égalité sur un défaut KeyValuePair et un KeyValuePair

Exemple de Code (à partir d'une pré-extension de la méthode, de la proto-lambda statique ListUtilities classe 🙂 )

public static TKey 
        FirstKeyOrDefault<TKey, TValue>(Dictionary<TKey, TValue> lookups, 
                   Predicate<KeyValuePair<TKey, TValue>> predicate)
{
    KeyValuePair<TKey, TValue> pair = FirstOrDefault(lookups, predicate);

    return pair == default(KeyValuePair<TKey, TValue>) ? 
                   default(TKey) : pair.Key;
}

Exception:

Opérateur '==' ne peut pas être appliquée à
des opérandes de type
'Système.Les Collections.Génériques.KeyValuePair<string,object>'
et
'Système.Les Collections.Génériques.KeyValuePair<string,object>'

Est-ce parce que, comme un struct, le KeyValuePair n'est pas nullable? Si c'est le cas, pourquoi, comme, sans doute, par défaut a été mis en œuvre pour gérer pas les types nullables?

MODIFIER

Pour l'enregistrement, j'ai choisi @Chris Hannon comme réponse sélectionnée, car il m'a donné ce que je cherchais, le plus élégant de l'option, et une brève explication, cependant, je fais de la promotion de la lecture @Dasuraga pour un ensemble très complet qui explique pourquoi c'est le cas

  • FirstOrDefault<KeyValuePair<TKey,TValue>>(recherches, prédicat) ?
  • Pellerin, qui doit être déduit du type transmis, ou le compilateur qui se serait plaint. L'exception se produit également lorsque vous simplifier à myKvp == défaut(KeyValuePair<...>)
  • Sûrement les valeurs par défaut sont dressées à des types scalaires? Que signifie, pour un KVP, pour avoir une valeur par défaut? J'imagine que vous avez une réponse à cette question dans le contexte de ce que vous essayez de construire. Je suppose que pour les non-scalaires la valeur par défaut est ce que vous obtenez à partir de l'appel du néant constructeur. Dans ce cas, je m'attends à l'identité de l'objet de la comparaison de fausse déclaration puisque vous obtenez un nouvel objet à chaque fois que le constructeur est appelé.
InformationsquelleAutor johnc | 2011-06-16