2015-04-16 117 views
4

我有工作了以下方法:無法轉換表達式類型返回類型

public Option<IAppSettings> GetFirst<T>() where T : IAppSettings 
{ 
    return _sources.Where(x=>x.GetType() == typeof(T)).FirstOption(); 
} 

List<IAppSettings> _sources; 

,但是,我想改變簽名:我是回通用T

public Option<T> GetFirst<T>() where T : IAppSettings 

注而不是IAppSettings

我得到錯誤(截斷類型):

不能表達型Option<IAppSettings>轉換爲Option<T>

我知道這事做泛型,但他們承認吸....我用盡的inoutinterfacedelegate不同的手段。 ..但沒有工作,因爲這是一個使用實例變量的非泛型類的方法。

這甚至可能嗎?

更新思想

我必須改變類型規格Option?如果是這樣,我猜它必須是Option<in T>?我說,只是因爲Option[+A]我有源Option Scala的Option鍵入,但它是改變和推動了痛苦......這樣想我會先問在這裏,但會嘗試,未來

選項是來自my fork of scalesque

+1

這可能取決於哪種類型的泛型允許選項否?應用相同嗎? –

+1

只用小片段很難說。例如,包含類是否也包含泛型T參數?如在'公共班級父 {}'?在這種情況下,該泛型可能會影響該方法。 –

+1

@TravisJ我說包含的類不是通用的。我只是更新以清楚說明'sources'是一個'List ',儘管 –

回答

5

您在尋找Enumerable.OfType方法。這應該取代你的Where()方法。

https://msdn.microsoft.com/en-us/library/vstudio/bb360913(v=vs.100).aspx

你得到的問題是,簡單地做一個「如果」的類型實際上不會將它轉換爲T檢查;一旦通過該過濾,集合對象仍然只知道是IAppSettings。我提到的C#標準函數會爲你做到這一點。

+0

我可以創建一張單獨的票,但是如果您知道爲什麼需要OfType,那麼您很好奇嗎? T被限制爲一個IAppSetting,所以它應該被自動轉換。有沒有一些用例我沒有想到,如果這被實施會破壞嗎? –

+0

'Where的定義是採用一個採用集合類型並返回布爾值的lambda。它的返回類型始終是與它所運行的集合類型相同的通用集合,並且沒有比這更具體。它不會分析你給它的lambda來找出你能夠返回的精確類型(heck,lambda可能是一個變量)。如果你的Where子句是'x - > x.toString()。contains(「cheese」)''那麼它也不會增加類型的具體性;你仍然只有一個IAppSettings集合,而不是一個T集合。 – Katana314

+0

我意識到,但T被限制爲一個IAppSettings,所以,它返回一個IAppSettings並期待一個T:IAppSettings。 –

0

在.FirstOption()之前添加.OfType()。

相關問題