2011-03-08 50 views
3

Wikipedia在語言學方面,與代表們相關的反向變化有什麼意義?

協變:從更寬的(雙)轉化成更窄(浮點)。
contravariant:從較窄(浮動)轉換爲較寬(雙)。

在.NET中,委託具有協方差,因爲它允許派生類型委託的指定的返回類型是其持有的基準的方法的返回類型。

除了一個代表具有逆變因爲它允許派生類型的代理的指定的參數(參數)要傳遞到它持有到基準的方法的參數的類型。

有了這兩個定義,因爲它們與代表有關,它們不應該都是協方差?在均爲的情況下,委託人期待「更寬」類型,但被給予「更窄類型」。

兩個從MSDN的一個例子見here

那麼,逆轉這個詞在涉及到代表時在語言上有意義嗎?

回答

2

我現在不同意SeanVDH的回答。他說:「在語言學上,從參數和回報的角度來看,這似乎是合乎邏輯的 - 所以向前或向後的方向是關於進入或離開功能的方向。」

相反,我認爲這是來自here答案:

協方差保留assignment compatibility和逆變逆轉它。協方差是一種加寬轉換,和逆變是變窄轉換。

當實例化一個委託,則 可以將其指定具有 衍生返回類型比在委託 (協方差)指定 的方法。還可以分配具有參數類型 比在委託 (逆變)衍生的 方法。着重強調

例子:

static object GetObject() { return null; } 
static void SetObject(object obj) { } 

static string GetString() { return ""; } 
static void SetString(string str) { } 

static void Main() 
{ 
    // Covariance. A delegate specifies a return type as object, 
    // but I can assign a method that returns a string. 
    Func<object> del = GetString; 

    // Contravariance. A delegate specifies a parameter type as string, 
    // but I can assign a method that takes an object. 
    Action<string> del2 = SetObject; 

    // But implicit conversion between generic delegates is not supported until C# 4.0. 
    Func<string> del3 = GetString; 
    Func<object> del4 = del3; // Compiler error here until C# 4.0. 
} 

這樣就實現了讀埃裏克利珀的文章結果,快速跟蹤代表的協方差和逆變節喬恩斯基特的書C#深度,以及上面的引用來源的鏈接。

相關問題