2013-03-12 64 views
0

看看這個片斷接口<T>方法<T2>其中T2:T

public interface IExample<T> 
{ 
    IExample<T> Exposes<TInclude>() 
     where T : TInclude; 
} 

我期待編譯時強制執行T是強制轉換爲TInclude。可以做一個運行時檢查,但寧願它是編譯時間。

以上抱怨T未定義。

有什麼建議嗎?我試圖用C#泛型來做什麼?

+1

我編輯了您的標題。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 – 2013-03-12 19:43:20

+2

你得到了這個倒退。我擔心你不能做靜態的問題。 – 2013-03-12 19:44:01

+4

可能有'TInclude:T',但不能'T:TInclude'。 – dtb 2013-03-12 19:44:04

回答

5

改寫你的問題:

它有可能使一個where條款,強制的約束TIncludeT或衍生自T的任何類型。我正在尋求強制執行「反向」約束:TIncludeT或任何「基本類型」T。這可能嗎?

編號C#不支持這種約束。抱歉。

有什麼建議嗎?

斯卡拉支持我認爲的那種約束。與Java一樣,儘管Java的做法有點奇怪。但是我想你不想改變語言。

你能更詳細地描述一下你真正想用這個接口表示的概念嗎?如果我們知道你在做什麼,那麼給你實際的建議會更容易。

+0

這個答案更直接地解決了我的意圖。 – 2013-03-12 21:46:10

+0

我要去我認爲編譯時間的安全性很好,但不是那麼重要,基本上,我們正在構建的系統特別「暴露」某些類作爲他們實現的接口,還有很多需要解釋的東西,所以TContract是一個可以由T實現的接口,並且我想在編譯時捕獲任何錯誤。 – 2013-03-12 21:47:19

+0

@JoshuaEvensen:我不知道.Net代碼合同是否可以將這些運行時檢查轉化爲編譯時檢查 – Brian 2013-03-13 13:41:35

1

您可以將類型約束移動到界面的水平,這樣的:

public interface IExample<T, U> 
    where T : U 
{ 
    IExample<T, U> Exposes(); 
} 
+0

你打敗了我。 ;-( – 2013-03-12 19:55:06

+3

要擴大Marcin的解決方案,泛型類型的約束必須在聲明泛型的東西 - 在這種情況下是接口,而不是方法。 – 2013-03-12 20:04:08

0

它可能在某一天實施:請參閱1.2 Generalized Constraints

+0

該鏈接無法正常工作,這就是爲什麼只有鏈接的答案令人不悅。 – 2013-03-12 20:18:40

+0

這是多頁pdf,它似乎工作... – QrystaL 2013-03-12 20:24:07

+0

它似乎回來了。我收到一條消息,說「網站已關閉」。 – 2013-03-12 20:24:41

相關問題