2013-04-09 49 views
0

泛型方法調用 - 沒有從「IValue」到「IValueFox」的隱式引用轉換。這段代碼的處理是什麼?泛型方法調用轉換錯誤的原因?

public interface IValueFox : IValue 
{ 
    ... 
} 

private Mock<I> GenerateMockValue<I, T>(State state, T type) 
where I : class, IValueFox 
{ 
    ... 
} 

private void TestFoxValues() 
{ 
    var newFox = this.GenerateMockValue<IValue, object>(State.Red, null); 
    ... 
} 

並獲得以下錯誤,當我調用方法「GenerateMockValue」「TestFoxValues」:

「IValue」不能被用作類型參數「I」在通用型或 方法' GenerateMockValue」。從'IValue'轉換爲'IValueFox'沒有暗示參考 。

但我不明白的是,爲什麼需要任何轉換,因爲IValueFox實現了IValue。任何人都可以爲我澄清這個問題嗎?

在此先感謝!

回答

3

因爲你需要一個IValueFox,這就像是一個IValue的超集。 (每個IValueFox都是IValue,但不是每個IValue都是IValueFox)

因此,IValue不能轉換爲IValueFox。

where-clause說「我需要一個IValueFox」,但是在TestFoxValues()方法中,你說「我只是要提供一個IValue」。

這裏是更簡單的例子: 你的課程需要一輛車。一輛汽車是一輛輪式汽車。 接下來你說:「在這裏,我給你提供了一個輪式機動車,但我沒有告訴你它到底是什麼,可能是一輛摩托車」然後你上課說「我明確要求一輛車! < ==這是你得到的錯誤。

+0

汽車和車輪將是一個構圖的例子,而不是繼承,是迂腐。 – Matthew 2013-04-09 21:04:03

+0

你說得對。我將這個例子修改爲「輪式機動車」:-) – 2013-04-09 21:12:07