【发布时间】:2014-08-25 03:45:10
【问题描述】:
我尝试在 C# 中编译以下代码:
public static T FirstEffective(IEnumerable<T> list)
{
Predicate<T> pred = x => x != null;
return Enumerable.FirstOrDefault(list, pred);
}
编译器 (Mono/.NET 4.0) 给出以下错误:
File.cs(139,47) The best overloaded method match for `System.Linq.Enumerable.FirstOrDefault<T>(this System.Collections.Generic.IEnumerable<T>,System.Func<T,bool>)' has some invalid arguments
/usr/lib/mono/4.0/System.Core.dll (Location of the symbol related to previous error)
File.cs(139,47): error CS1503: Argument `#2' cannot convert `System.Predicate<T>' expression to type `System.Func<T,bool>'
这很奇怪,因为 Predicate<T> 实际上是一个将参数 T 作为输入并返回 bool 的函数(T 甚至是“协变的”,因此允许 T 的特化)。代表们是否没有考虑“Liskov 替换原则”来推导出Predicate<T> 等价于Func<T,bool>?据我所知,这个等价问题应该是可判定的。
【问题讨论】:
-
这是相关的,但没有解释为什么不执行等价检查。如前所述,委托类型的等价性是可以确定的......
-
顺便问一句:C# 类型系统实际上不是图灵完备的吗?类型系统是否需要图灵完备才能使其不可判定?子类型化的一般问题是不可判定的;您可能会对这篇论文感兴趣:research.microsoft.com/pubs/64041/fool2007.pdf。 C# 在编写时还没有逆变,但现在有了,所以关于 IL 语言的部分适用于 C# 4.0。
-
@EricLippert:抱歉,确实选词不当。非常感谢。
标签: c# function delegates predicate