无法将表达式类型转换为 return 类型

Cannot convert expression type to return type

我有以下有效的方法:

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

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

Cannot convert expression type Option<IAppSettings> to Option<T>

我知道这与泛型有关,但不可否认它们很糟糕....我尝试了 inoutinterface 的不同方法delegate...但是 none 起作用,因为这是使用实例变量的非泛型 class 上的方法。

这可能吗?

更新的想法

我是否必须更改 Option 中的类型规范?如果是这样,我猜它必须是 Option<in T>?我说那只是因为 Scala 的 Option 被输入为 Option[+A] 我有 Option 的源代码,但是改变和向上推是一件痛苦的事情......所以我想我会先在这里问, 但接下来会尝试

Option 来自 my fork of scalesque

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

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

您遇到的问题是,简单地对类型进行 "if" 检查实际上不会将其转换为 T;一旦通过过滤,集合对象仍然只知道类型 IAppSettings。不过,我提到的 C# 标准函数会为您做到这一点。

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