2013-03-06 4 views
0

У меня есть следующий класс:C# Generic T назначить тип Кортеж

public static class Support<T> 
{ 
    public static T CreateKeyNameJSONTT(IEnumerable<Tuple<T, T>> a, Action<T> b) 
    { 
     T result = default(T); 

     try 
     { 
      foreach (var entry in a) 
      { 
       b((T)TypeDescriptor.GetConverter(typeof(T)).ConvertFromInvariantString("[ \"" + entry.Item1 + "\", " + entry.Item2 + "\" ]")); 
      } 
      result = (T)Convert.ChangeType(true, typeof(T)); 
     } 
     catch 
     { 
      result = (T)Convert.ChangeType(false, typeof(T)); 
     } 

     return result; 
    } 
} 

Я не могу показаться, чтобы назвать это правильно, хотя:

var result = Support.CreateKeyNameJSONTT(List<Tuple<int, string>> list, (string entry) => 
{ 
}); 

Ошибки я получаю «Использование списка универсального типа требует 1 аргумент "

Может ли кто-нибудь помочь в этом. Я ничего не делаю, поэтому могу ошибаться.

+1

Вы передаете '' Tuple но метод ожидает '' Tuple . То есть оба члена кортежа должны иметь один и тот же тип –

+0

. Замечание стороны: вы, вероятно, не видите строку кода, которая вызывает ошибку. В ответе Servy +1 есть исправления для кода, который вы указали, но похоже, что у вас что-то вроде 'new List()' где-то, что вызывает ошибку. –

ответ

3

Вы не сможете использовать List<Tuple<int, string>>, потому что в определении метода вы сказали, что первый параметр: IEnumerable<Tuple<T, T>>. Ключевым моментом здесь является то, что первый и второй общие аргументы для Tuple одинаковы; они не могут отличаться от того, что вы передаете при вызове метода.

Вы могли бы назвать это так, хотя:

List<Tuple<string, string>> list = null; 
var result = Support<string>.CreateKeyNameJSONTT(list , (string entry) => 
{ 
}); 

Это будет компилировать. (И сбой во время выполнения, но это еще одна проблема.)

Обратите внимание, что общий аргумент необходимо предоставить Support в форме: Support<string>. Тип не может быть выведен для общего аргумента класса, только (потенциально) для методов. Вы можете получить вывод типа, если вы изменили определение:

public static class Support 
{ 
    public static T CreateKeyNameJSONTT<T>(...) 
+0

@adviner Вы не можете поместить много кода в комментарий; есть довольно низкий лимит символов. Если ваша проблема была решена в результате этого ответа, не стесняйтесь просто пометить ее и сделать. Если это не так, вы получаете ту же ошибку, другую ошибку или что? Если это та же проблема, вы можете изменить свой новый код в вопросе. Если это не так, возможно, вы должны задать другой вопрос. – Servy

+0

Спасибо Сервис, ты помог мне понять это лучше. Мне удалось исправить код и обновить мой вопрос, чтобы показать рабочий код. – adviner

+0

@adviner Неправильно редактировать код в вопросе, чтобы удалить проблему, которая была причиной вопроса. Поскольку этого ответа, по-видимому, было достаточно, чтобы вы могли ответить на вопрос, должно быть хорошо оставить все должности такими, какие они есть. – Servy