2010-04-12 67 views
3

在C#和VB中,都使用類型參數修飾符來表示類型參數的方差。例如,C#的版本是這樣的:C#和VB中類型參數方差的語法選擇

interface Foo<in X, out Y> { } 

和VB版本是這樣的:

Interface Foo(Of In X, Out Y) 

End Interface 

由於變更規格基本上限制在哪裏以及如何類型參數可以用,我傾向於認爲他們作爲類型參數的附加約束。

我只是好奇他們爲什麼沒有代表如此。我的意思是,爲什麼它們在兩種語言中表示爲類型參數的附加修飾符,而不是添加到類型約束列表中?如果他們類型的限制,C#版本會一直看起來像:

interface Foo<X, Y> where X:in where Y:out { } 

和VB版本會一直看起來像:

Interface Foo(Of X As In, Y As Out) 

End Interface 

因此,沒有人知道,如果有一些背後的推理在這些語言中表達類型參數方差的特定語法選擇,還是僅僅是隨機的?

+0

是的。我同意目前的實施看起來更清潔,我也沒有任何問題。 但是,如果這些只是附加約束條件,給他們一個特殊的地方是沒有意義的,除非他們經常使用。雖然類型參數方差是一個非常好的功能,但我無法想象經常使用它以保證特定的語法。 所以,我只是想知道如果我把它們當作類型參數的約束是錯誤的。 – CodeMangler 2010-04-12 16:54:13

+0

雖然它們不是類型參數的限制,但是......您不應將這些看作是對類型的限制。 – 2010-04-12 16:55:37

回答

2

我覺得語言設計師在這裏做出了很好的選擇。

原因是協方差和反變化不是對類型(在你的情況下是X/Y)的約束,而是在接口本身。

如果您使用的where X: inOf X As In語法,你所建議的X型的約束。然而,協方差和反變量實際上是對接口本身的「約束」 - 通用類型的接口將如何使用類型「T」。例如,說:

interface Foo<out X> {} 

你說「這個接口只使用X作爲輸出」,這實際上是說,你在某種程度上制約使用X的允許協方差。

這比說「X需constrainted到特定類型的」非常不同,因爲這是不是X.

約束通過引入新的語法,語言設計者使我們概念化這通過不混合消息更有效。

+0

啊!這很有道理。從來沒有這樣看過。 對於這個語法選擇是一個很好的選擇,我不能同意,現在我明白類型參數差異規格不僅僅是約束。 感謝您的解釋:) – CodeMangler 2010-04-12 17:31:35

+0

@CodeMangler:很高興幫助。協變和逆變是一種棘手的問題 - 但是是的,你絕對不應該將這些看作是這種類型的限制 - 它們實際上並不限制這種類型。 :) – 2010-04-12 17:34:20