2014-04-28 16 views
1

爲什麼我們需要在兩次使用類型下面的方法爲什麼泛型類型在方法簽名中出現兩次?

public void Search<T>(T bo) { } 

,我們可以只聲明

public void Search(T bo){}. 

無法找到這個答案?請幫忙。

在此先感謝。

+0

編譯器使用第一個'T'來確定參數應該是什麼類型。第二個'T'用於告訴編譯器你需要一個這種類型的參數。 – ps2goat

+1

我編輯了你的標題,讓你的問題更清晰一些。 –

+0

謝謝你螞蟻。 – Roninn

回答

3

在片段:

public void Search<T>(T bo); 

<T>明確說明存在一個稱爲T一個類型參數。然後,T bo指定存在類型爲T的參數,其在該方法內將被稱爲bo

如果您不包含<T>部分,編譯器無法知道bo是一個通用參數,而不僅僅是一個名爲T的類的實例。

它可能更容易理解,如果你知道以下實現同樣的事情:

public void Search<Something>(Something bo); 

如果<Something>部分被排除在外,有會是什麼,從正常的方法區分這一點,需要一個類的實例稱爲Something

01:

public void Search(Something bo); 

要到你的第二個問題作出迴應

只有public void Search(<T> bo)沒有意義嗎?

這不起作用,因爲泛型類型不一定使用參數。也不一定是返回類型。它可能不會出現在方法簽名的其他地方。一個簡單的例子可能是:

public bool IsType<T>(object input) 
{ 
    return input.GetType() == typeof(T); 
} 

在這種情況下,類型參數是絕對必要的。可能有一些情況下可以使用您建議的語法來推斷,但這會導致不同情況下的各種不一致。

+0

感謝Ant和大家,這非常有幫助。 – Roninn

2

編譯器怎麼可能知道T是一個泛型參數還是一個類型?你不能有一個名爲T的類或結構嗎?那麼,編譯器應該如何處理這種情況呢?

考慮一下:

class Foo { } 

static void DoSomething(Foo f) { } 

在這種情況下應該DoSomething通用非通用?根據你的邏輯無法做出決定。

1

當你做到這一點

public void Search(T bo){}. 

它說T是一個輸入參數,但沒有說是什麼T,這是完全正常的有一個類名T這將是ambigious。所以通過以下我們說編譯器T是一個通用參數。

public void Search<T>(T bo) { } 

還要注意,當你在一個泛型類中時,你可以像版本1那樣做。例如

class Test<T> 
{ 
    public void Search(T bo){}. 
} 

這是完全合法的。因爲我們知道T是一個通用參數,您應該在構建類時提供這個參數。

1

需要避免含糊不清,因爲T本身是有效的類型。假設你寫道:

Search(T bo){} 

和其他地方你有:

public class T { } 

編譯器必須解釋T爲類T一個參考,而不是一個泛型類型參數。

的方法(或類)名後的<T>標識T一個普通的類名,但這種方法(或類)的上下文內的通用類型參數。

+0

對於上面的所有答案,只有公共無效搜索( bo)纔沒有意義。 – Roninn

+0

@MeProgramming這可能是一種有效的替代語法,但這不僅僅是C#團隊設計語言的方式。請注意[F#有一些類似的東西](http://msdn.microsoft.com/en-us/library/dd233215.aspx)(例如'search(bo:'A)= ...') –

+0

@MeProgramming查看我的答案更新。 –

相關問題