2012-12-29 45 views
3
public interface ILovable<T> where T : IEquatable<T> 
{ 
    T Care(T t); 
} 

public class Me : ILovable<int> 
{ 
    public int Care(int i) 
    { 
     return i; 
    } 
} 

說我有上述。現在下面的功能失敗:不能通過符合通用約束的類型的變量

private static void Colour<T>(ILovable<T> me) where T : IEquatable<T> 
{ 
    var z = me.Care(1); //cannot convert from 'int' to 'T' 
} 

什麼是失敗的上述代碼? ILovable<T>有一個Care函數,它取得一個T這是IEquatable<T>。在上面的函數中我調用了Care函數並傳遞了T這是int類型。 int畢竟是IEquatable<int>

我在做什麼錯?有沒有解決問題的方法?

回答

0

簡短的回答是壓倒T類型的變量有多個派生類型的通用方法(或類)內是不可能的,因爲編譯器不知道明確的是T更多的派生類型(在我們的例子Tint) ,因爲T在運行時可以是任何其他派生類型。

長答案:me變量類型爲ILovable<T>。現在me.Care函數需要在ILovable<T>上指定的類型參數,即TCare以外的功能T可以是IEquatable<T>,因此int可以。但是在函數內部,T必須只是T而不是另一個派生類型IEquatable<T>。否則會出現運行錯誤這樣的場景:

private static void Colour<T>(ILovable<T> me) where T : IEquatable<T> 
{ 
    var z = me.Care(1); 
} 

... 

Colour(""); 

眼下,T是字符串調用Colour("")時。所以meILovable<string>。所以me.Care函數期望string作爲參數,但提供的是int,這是災難。

1

我得到的錯誤是:

Argument type 'int' is not assignable to parameter type 'T' 

我敢肯定,這是因爲你定義me作爲ILovable<T>。因此,它不會自動解析爲其中int被定義爲TMe類型。

private static void Colour<T>(Me me) where T : IEquatable<T> 
     { 
      var z = me.Care(1); 
     } 
3

你的方法簽名不指定ILovable<int>,它指定一個ILovable<T>

因爲MeT定義爲int這會修正這個錯誤。這一點,例如,將工作:

private static void Colour(ILovable<int> me) 
{ 
    var z = me.Care(1); //cannot convert from 'int' to 'T' 
} 

的問題是編譯器不知道T是你的榜樣的「廉政」;它可以是任何符合約束的類型。這裏,將工作的另一種方式:

private static void Colour<T>(ILovable<T> me, T valueToCareAbout) where T : IEquatable<T> 
{ 
    var z = me.Care(valueToCareAbout); 
} 
//use like this 
Colour(me, 1); 
1

嗯,這是因爲方法的顏色表示,將有型ILovable < T>的參數,而T公司將在以後解決,所以在編譯時任我告訴方法T是int類型。

因此,無論傳遞ILovable作爲參數和受讓人T是INT

void Colour<T>(ILovable<int> me) 

或通過鍵入我直接

void Colour<T>(Me me) 

因爲否則me.Care期待類型T不是作爲特定的詮釋

1

更改以下內容

private static void Colour<T>(ILovable<T> me) where T : IEquatable<T> 

private static void Colour<Int32>(ILovable<int> me) 

以上會工作。現在mystry部分


你得到在以下

private static void Colour<T>(ILovable<T> me) where T : IEquatable<T> 

因爲Care期待T錯誤,並且您提供int
它與

Care((T)1)相同。

T t = (T)1; //This is the cause of error as int cannot be changed to T. Remember Int32 is sealed so T cannot derive from int 

Care(t); // This is fine 

爲了使上述工作,Tint。爲了使它如此,Colur方法的語法應該像

private static void Colour<Int32>(ILovable<int> me) 

如果你想傳遞的字符串CareT應該string

private static void Colour<string>(ILovable<string> me) 
    { 
    me.Care("Hello"); 
    } 

現在,如果我們必須要修好T接問題是,爲什麼在所有Colour定義需要噸。

解決方案 - >對於非密封類中的非照顧繼承類型。