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

6

我有以下有效的方法:

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> 我知道这与泛型有关,但我承认我对它们不擅长...我尝试了不同的 inoutinterfacedelegate 的方法...但都没有成功,因为这是一个非泛型类上的方法,使用了一个实例变量。
这个可能吗?
更新的想法:
我必须改变 Option 中的类型规格吗?如果是这样,我猜它必须是 Option<in T> 吗?我之所以这么说,只是因为 Scala 的 Option 被标记为 Option[+A]。我有 Option 的源代码,但修改和推送起来很麻烦...所以我想先在这里问问,但接下来会尝试这个。

这个Option来自于我的scalesque分支


1
可能取决于泛型允许的选项类型,不是吗?应用相同吗? - Juan Pablo Garcia Coello
1
仅凭这些小片段很难确定。例如,包含类是否还包含一个泛型T参数?就像这样:public class Parent<T>{}?在这种情况下,该泛型类型可能会影响该方法。 - Travis J
1
@TravisJ 我说包含类不是泛型的。我刚刚更新了,明确说明sources是一个List<IAppSettings> - Justin Pihony
2
如果在 .FirstOption() 之前添加 .OfType<T>() 会发生什么? - Glorfindel
1
@Glorfindel,问题已解决!请将其提交为答案,我会接受。 - Justin Pihony
2个回答

6

我可以创建一个单独的票据,但是想知道为什么需要使用OfType?T被限制为IAppSetting,因此应该会自动转换。如果实现了这个功能,是否有一些用例我没有考虑到会出现问题? - Justin Pihony
“Where” 的定义是接受一个以集合类型为参数并返回布尔值的 lambda 表达式。其返回类型始终是与作用集合相同类型的通用集合,并且不比其更具体。它不会分析您提供的 lambda 表达式以确定您能够返回什么精确类型(甚至 lambda 可能是一个变量)。如果您的 Where 子句是 x -> x.toString().contains("cheese"),它也不能增加类型特定性;您仍然只有一个 IAppSettings 集合,而不是 T 集合。 - Katana314
我明白,但是T被限制为IAppSettings,因此它返回一个IAppSettings并期望一个T:IAppSettings。 - Justin Pihony
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Katana314
真的,方差总是让我头疼不已。这和 Liskov 原则是我的答案。谢谢。 - Justin Pihony

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接