我有以下方法可行:
public Option<IAppSettings> GetFirst<T>() where T : IAppSettings
{
return _sources.Where(x=>x.GetType() == typeof(T)).FirstOption();
}
List<IAppSettings> _sources;
但是,我想将签名更改为:
public Option<T> GetFirst<T>() where T : IAppSettings
请注意,我将返回通用T
而不是IAppSettings
我收到错误(截断类型):
无法将表达式
Option<IAppSettings>
转换为Option<T>
我知道这与仿制药有关,但不可否认的是......我已经尝试了in
,out
,interface
的不同方法, delegate
...但没有一个工作,因为这是使用实例变量的非泛型类的方法。
这甚至可能吗?
更新了想法
我是否必须更改Option
中的类型规范?如果是这样,我猜它必须是Option<in T>
?我之所以这么说只是因为Scala的Option
被输入为Option[+A]
我有Option
的来源,但改变和推高是一种痛苦...所以我想会先问这里,但会尝试下一个
此Option
来自my fork of scalesque
答案 0 :(得分:5)
您正在寻找Enumerable.OfType
方法。这应该取代您的Where()
方法。
https://msdn.microsoft.com/en-us/library/vstudio/bb360913(v=vs.100).aspx
你遇到的问题就是简单地做一个&#34;如果&#34;检查类型实际上不会将其转换为T
;一旦它通过了过滤,集合对象仍然只知道类型为IAppSettings
。我提到的C#标准功能会为你做到这一点。
答案 1 :(得分:0)
在.FirstOption()之前添加.OfType()。