2013-06-26 14 views
3
IDictionary<string, string> map = str.Split('|') 
            .ToDictionary(s => s.Split('@')[0], s => s.Split('@')[1]); 

以上聲明起作用。但我想將其更改爲通用的IDictionary與通用的Lambda

public class CSVMap <TKey, TValue> 
{ 
    public IDictionary<TKey, TValue> func (string str) 
    { 
     IDictionary<TKey, TValue> map = str.Split('|').ToDictionary (ConvertValue<TKey>(s => s.Split('@')[0]), ConvertValue<TValue>(s => s.Split('@')[1])); 

    } 
    public static T ConvertValue<T>(string value) 
    { 
     return (T)Convert.ChangeType(value, typeof(T)); 
    } 

ConvertValue投分割字符串的TKeyTValue類型。

但我得到了這些錯誤的ConvertValue部分:

錯誤CS1660:無法轉換lambda表達式到類型「串」,因爲它不是一個委託類型
錯誤CS1660:無法轉換lambda表達式類型'字符串',因爲它不是委託類型

我不確定錯誤是什麼意思或如何解決這樣的問題。

+1

正確的術語是「泛型」,而不是「模板」。模板是C++所具有的。 –

+0

@JohnSaunders:.. *更改爲**模板** IDictionary * <=您錯過了一個.. –

回答

5

您將一個lambda表達式傳遞給ConvertValue函數而不是該值。不知道這是否符合你的期望,但這是至少正確的語法。

IDictionary<TKey, TValue> map = str.Split('|').ToDictionary (s=>ConvertValue<TKey>(s.Split('@')[0]), s=>ConvertValue<TValue>(s.Split('@')[1]));