无法将表达式转换为返回类型

Jus*_*ony 4 c# generics variance

我有以下方法:

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

List<IAppSettings> _sources;
Run Code Online (Sandbox Code Playgroud)

但是,我想将签名更改为:

public Option<T> GetFirst<T>() where T : IAppSettings
Run Code Online (Sandbox Code Playgroud)

请注意,我将返回通用T而不是IAppSettings

我收到错误(截断类型):

无法将表达式转换Option<IAppSettings>Option<T>

我知道这事做泛型,但不可否认他们吮吸....我试过的不同手段in,out,interface,delegate...但没有工作,因为这是用一个实例上的非通用类的方法变量.

这甚至可能吗?

更新了想法

我是否需要更改类型规格Option?如果是这样,我猜它一定是Option<in T>吗?我之所以这么说只是因为Scala的Option输入是因为Option[+A]我有源Option,但改变并推高是一种痛苦......所以我想先问这里,但会尝试下一步

Option来自我的鳞片叉

Kat*_*314 5

您正在寻找该Enumerable.OfType方法.这应该取代你的Where()方法.

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

你得到的问题是,简单地对类型进行"if"检查实际上不会将其转换为T; 一旦它通过了过滤,集合对象仍然只是类型IAppSettings.我提到的C#标准功能会为你做到这一点.