Tôi đã có một kiểu generic:Tại sao mã này sẽ phàn nàn về "tính xác thực của định nghĩa kiểu chung"?
class DictionaryComparer<TKey, TValue> : IEqualityComparer<IDictionary<TKey, TValue>>
Và một phương pháp nhà máy mà sẽ (nên) tạo ra một thể hiện của lớp này cho một loại từ điển nhất định.
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);
}
Tước tất cả các nội dung không liên quan - ngay cả mã này cũng ném cùng một ngoại lệ.
private static object CreateDictionaryComparer()
{
Type def = typeof(DictionaryComparer<,>);
Type t = def.MakeGenericType(new Type[] { typeof(String), typeof(object) });
return Activator.CreateInstance(t);
}
Thông báo xác nhận vì vậy tôi biết rằng T
là chung và có hai đối số chung chung. Dòng có MakeGenericType
tuy nhiên, ngoại trừ:
Số lượng đối số chung được cung cấp không bằng với định nghĩa chung của định nghĩa loại chung.
tên Parameter: instantiation
tôi đã thực hiện việc này trong quá khứ và cho cuộc sống của tôi không thể tìm ra lý do tại sao điều này không làm việc trong trường hợp này. (cộng với tôi phải có Google arity).
Bạn đang chuyển từ 'T' sang' CreateDictionaryComparer' như thế nào? Tôi đã cố gắng đi qua 'CreateDictionaryComparer>()' và điều này làm việc tốt cho tôi (sử dụng Mono C# compiler phiên bản 1.9.1.0). –
Tôi đã có DictionaryComparer như một lớp bên trong với một cái mà chính nó là chung chung. Hãy nghĩ rằng đã được hosing lên các công trình. – dkackman
Chỉ cần ra khỏi tò mò, bạn có thể cung cấp đầy đủ (không) mẫu để tôi có thể thử nó trên trình biên dịch của tôi? –