我可以傳播在C#中的基類中聲明的派生類型的泛型約束嗎?C#通用約束問題
實施例程序將顯示錯誤:
類型「T」不能被用作通用型 或方法「Test.Base」類型參數「T」。沒有裝箱轉換或從'T'到'Test.IBase'的類型參數 轉換。
interface IBase
{
}
class Base<T> where T : IBase
{
}
class Derived<T> : Base<T>
{
}
我可以傳播在C#中的基類中聲明的派生類型的泛型約束嗎?C#通用約束問題
實施例程序將顯示錯誤:
類型「T」不能被用作通用型 或方法「Test.Base」類型參數「T」。沒有裝箱轉換或從'T'到'Test.IBase'的類型參數 轉換。
interface IBase
{
}
class Base<T> where T : IBase
{
}
class Derived<T> : Base<T>
{
}
class Derived<T> : Base<T> where T : IBase
{
}
這是我已經在基類上完成的重複任務。在C++中,這是可能的。 C#不提供任何技巧嗎? – 2013-03-27 09:32:18
不幸的是,在C#中,你應該總是在派生類型中定義約束。 – Rover 2013-03-27 12:22:53
應該是:
class Derived<T> : Base<T> where T : IBase
{
}
始終明確地把你的約束,因爲T是隻是一個聲明,這是不一樣的T作爲一個在你的基類。
我不知道爲什麼這個downvote是。你能詳細說明嗎? – 2013-03-27 09:54:31
在你Derived<T>
類,你並沒有指明T
必須實現IBase
因爲它的使用作爲一個類型參數在Base<T>
,你不能說任何T
都可以使用。將其更改爲:
class Derived<T> : Base<T> where T : IBase
這是我已經在基類上完成的重複任務。在C++中,這是可能的。 C#不提供任何技巧嗎? – 2013-03-27 09:33:39
這是另一個T,你仍然必須限制它;它不知道它與基類相同。 – 2013-03-27 09:36:09
@RajdipPatel:L-Three說了些什麼。將'T'想象爲一種方法的參數。僅僅因爲方法的兩個參數被命名爲相同的並不意味着它們指向相同的東西。 – 2013-03-27 09:41:38
我已經應用了,但是在html格式中存在錯誤。所以請再次檢查。 – 2013-03-27 09:29:57