2015-04-02 20 views
-3

沒有任何言語:.net字典有什麼不對?

public class MemoryDictionary<T> 
{ 
    private Dictionary<T, T> items = new Dictionary<T, T>(); 
    public T GetValue<T>(T value) 
    { 
     if (!items.ContainsKey(value)) 
     { 
      items[value] = value; 

     } 
     return items[value]; 
    } 
} 

這裏有什麼問題,爲什麼不把它編譯?我的意思是,這實際上是說ContainsKey方法有一個無效的參數,但是......它很愚蠢!爭論是正確的!

什麼奇怪的是:

public class MemoryDictionary<string> 
{ 
    private Dictionary<string, string> items = new Dictionary<string,string>(); 
    public string GetValue<string>(string value) 
    { 
     if (!items.ContainsKey(value)) 
     { 
      items[value] = value; 

     } 
     return items[value]; 
    } 
} 

此代碼,並在那裏我選擇了一些特定類型的編譯好......我驚呆了任何代碼...

+0

什麼是你所得到的確切編譯錯誤? – 2015-04-02 15:19:09

+2

您說編譯的代碼充滿了多個編譯器錯誤...... – Servy 2015-04-02 15:19:21

+1

作爲一個附註,任何時候您認爲C#語言或.NET類中的某一個都存在一個錯誤,您幾乎可以確定錯誤與您的使用相反。它是一個錯誤的語言或基礎庫的可能性很小。 – Servy 2015-04-02 15:29:05

回答

7

這裏的問題是,你已經定義了T兩次。你已經使類和方法都是泛型的,並給它們一個具有相同名稱的泛型參數。

您的字段是在該方法之外定義的,因此在該上下文中僅指代被聲明爲類的泛型參數的T

參數value在該方法的通用說法是在範圍上的位置被聲明,並自該方法的T比在類級別聲明的T「接近」,這「勝」當試圖解決的類型那個變量。

所以,現在你有T類型的參數,和Dicitonary<T, T>,並將該參數的又類型仍然是從字典的通用參數不同。

並且簡單明瞭的方法是去選擇通用參數並使用visual studio的「重命名」功能來重命名該類型(只需要T2或某物),然後您將看到哪個T的更改以及哪個別。這樣做之後,錯誤信息也是有意義的,因爲這些不同的類型實際上在錯誤信息中將以不同的方式顯示。

至於一個修復,只是使該方法不是通用的。

+0

謝謝!這有幫助! – eocron 2015-04-02 16:36:48

3

您在類中的泛型類型約束和GetValue()方法之間存在命名衝突。

拆卸方法類型的約束應該解決的問題:

public T GetValue(T value)