看看這個片斷接口<T>方法<T2>其中T2:T
public interface IExample<T>
{
IExample<T> Exposes<TInclude>()
where T : TInclude;
}
我期待編譯時強制執行T是強制轉換爲TInclude。可以做一個運行時檢查,但寧願它是編譯時間。
以上抱怨T未定義。
有什麼建議嗎?我試圖用C#泛型來做什麼?
看看這個片斷接口<T>方法<T2>其中T2:T
public interface IExample<T>
{
IExample<T> Exposes<TInclude>()
where T : TInclude;
}
我期待編譯時強制執行T是強制轉換爲TInclude。可以做一個運行時檢查,但寧願它是編譯時間。
以上抱怨T未定義。
有什麼建議嗎?我試圖用C#泛型來做什麼?
改寫你的問題:
它有可能使一個
where
條款,強制的約束TInclude
是T
或衍生自T
的任何類型。我正在尋求強制執行「反向」約束:TInclude
是T
或任何「基本類型」T
。這可能嗎?
編號C#不支持這種約束。抱歉。
有什麼建議嗎?
斯卡拉支持我認爲的那種約束。與Java一樣,儘管Java的做法有點奇怪。但是我想你不想改變語言。
你能更詳細地描述一下你真正想用這個接口表示的概念嗎?如果我們知道你在做什麼,那麼給你實際的建議會更容易。
這個答案更直接地解決了我的意圖。 – 2013-03-12 21:46:10
我要去我認爲編譯時間的安全性很好,但不是那麼重要,基本上,我們正在構建的系統特別「暴露」某些類作爲他們實現的接口,還有很多需要解釋的東西,所以TContract是一個可以由T實現的接口,並且我想在編譯時捕獲任何錯誤。 – 2013-03-12 21:47:19
@JoshuaEvensen:我不知道.Net代碼合同是否可以將這些運行時檢查轉化爲編譯時檢查 – Brian 2013-03-13 13:41:35
您可以將類型約束移動到界面的水平,這樣的:
public interface IExample<T, U>
where T : U
{
IExample<T, U> Exposes();
}
你打敗了我。 ;-( – 2013-03-12 19:55:06
要擴大Marcin的解決方案,泛型類型的約束必須在聲明泛型的東西 - 在這種情況下是接口,而不是方法。 – 2013-03-12 20:04:08
它可能在某一天實施:請參閱1.2 Generalized Constraints
該鏈接無法正常工作,這就是爲什麼只有鏈接的答案令人不悅。 – 2013-03-12 20:18:40
這是多頁pdf,它似乎工作... – QrystaL 2013-03-12 20:24:07
它似乎回來了。我收到一條消息,說「網站已關閉」。 – 2013-03-12 20:24:41
我編輯了您的標題。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 – 2013-03-12 19:43:20
你得到了這個倒退。我擔心你不能做靜態的問題。 – 2013-03-12 19:44:01
可能有'TInclude:T',但不能'T:TInclude'。 – dtb 2013-03-12 19:44:04