J'ai un type générique:Pourquoi ce code se plaindre de "l'arité de la définition de type générique"?
class DictionaryComparer<TKey, TValue> : IEqualityComparer<IDictionary<TKey, TValue>>
Et une méthode de fabrication qui (devrait) créer une instance de cette classe pour un type donné dictionnaire.
private static IEqualityComparer<T> CreateDictionaryComparer<T>()
{
Type def = typeof(DictionaryComparer<,>);
Debug.Assert(typeof(T).IsGenericType);
Debug.Assert(typeof(T).GetGenericArguments().Length == 2);
Type t = def.MakeGenericType(typeof(T).GetGenericArguments());
return (IEqualityComparer<T>)Activator.CreateInstance(t);
}
Suppression de tous les éléments superflus - même ce code lève la même exception.
private static object CreateDictionaryComparer()
{
Type def = typeof(DictionaryComparer<,>);
Type t = def.MakeGenericType(new Type[] { typeof(String), typeof(object) });
return Activator.CreateInstance(t);
}
Le Affirme passe donc je sais que T
est générique et a deux arguments génériques. La ligne avec MakeGenericType
cependant excepte avec:
Le nombre d'arguments génériques fournis ne correspond pas à l'arité de la définition de type générique.
Nom du paramètre: instanciation
je l'ai fait ce genre de chose dans le passé et pour la vie de moi ne peut pas comprendre pourquoi cela ne fonctionne pas dans ce cas. (plus je devais Google arity).
Que transmettez-vous comme 'T' à' CreateDictionaryComparer'? J'ai essayé de passer 'CreateDictionaryComparer>()' et cela fonctionne très bien pour moi (en utilisant la version 1.9.1.0 du compilateur C# Mono). –
J'avais DictionaryComparer comme une classe interne à celui qui est lui-même générique. Pensez que cela a détruit les travaux. – dkackman
Juste par curiosité, pourriez-vous fournir l'échantillon complet (échouer) afin que je puisse l'essayer sur mon compilateur? –