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

时间:2015-04-16 20:44:26

标签: c# generics variance

我有以下方法可行:

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>

我知道这与仿制药有关,但不可否认的是......我已经尝试了inoutinterface的不同方法, delegate ...但没有一个工作,因为这是使用实例变量的非泛型类的方法。

这甚至可能吗?

更新了想法

我是否必须更改Option中的类型规范?如果是这样,我猜它必须是Option<in T>?我之所以这么说只是因为Scala的Option被输入为Option[+A]我有Option的来源,但改变和推高是一种痛苦...所以我想会先问这里,但会尝试下一个

Option来自my fork of scalesque

2 个答案:

答案 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()。