Il s'agit d'un suivi de cette question : Cast<int>.Cast<int?> appliqué sur une collection d'enum générique entraîne une exception de cast invalide
enum Gender { Male, Female }
Gender g = Gender.Male;
bool b = g is int; // false, alright no issues
b = new[] { g } is IEnumerable<int>; // false, alright no issues
b = Is<Gender, int>(g); //false, alright no issues
b = Is<Gender[], IEnumerable<int>>(new[] { g }); // true, why on earth !!!
static bool Is<S, T>(S s)
{
return s is T;
}
Pourquoi est-ce que Gender[] is IEnumerable<int>
renvoie à true
dans le cas générique ? Surtout quand ils ne sont pas compatibles entre eux ?
IEnumerable<int> c = new[] { Gender.Male }; //not compilable
Il m'avait fait trébucher dans la question que j'ai liée ! Je pense que cette question est le nœud du problème de la question liée.
Pour ceux que cela intéresse, c'est un cas particulier avec les tableaux (pas vraiment des enums). Suivez Le blog d'Eric Lippert article dans la réponse pour en savoir plus sur ce cas limite. Cela ne se produit pas avec List<T>
par exemple :
b = Is<List<Gender>, IEnumerable<int>>(new List<Gender> { g }); // false, rightly