为什么不能将匿名方法分配给var?

马龙

我有以下代码:

Func<string, bool> comparer = delegate(string value) {
    return value != "0";
};

但是,以下内容无法编译:

var comparer = delegate(string value) {
    return value != "0";
};

为什么编译器无法弄清楚它是一个Func<string, bool>它采用一个字符串参数,并返回一个布尔值。相反,它给了我错误:

无法将匿名方法分配给隐式类型的局部变量。

我有一个猜测,那就是如果var版本已编译,如果我具有以下内容,它将缺乏一致性:

var comparer = delegate(string arg1, string arg2, string arg3, string arg4, string arg5) {
    return false;
};

由于Func <>最多只允许4个参数(在我正在使用的.NET 3.5中),因此上述内容没有任何意义。也许有人可以澄清这个问题。谢谢。

埃里克·利珀特

其他人已经指出,您可能意味着无限多种委托类型什么特别之处Func,它不愧为默认的替代PredicateAction或任何其他可能性?而且,对于lambda而言,为什么明显是要选择委托形式而不是表达式树形式呢?

但是我们可以说这Func很特殊,并且lambda或匿名方法的推断类型是某物的Func。我们仍然会遇到各种各样的问题。在以下情况下,您想推断出什么类型?

var x1 = (ref int y)=>123;

没有Func<T>类型可以引用任何东西。

var x2 = y=>123;

尽管我们知道返回值,但我们不知道形式参数的类型。(还是我们?return int?long?short?byte?)

var x3 = (int y)=>null;

我们不知道返回类型,但是它不能为空。返回类型可以是任何引用类型或任何可为空的值类型。

var x4 = (int y)=>{ throw new Exception(); }

同样,我们不知道返回类型,这一次它可能是无效的。

var x5 = (int y)=> q += y;

它是要作为返回void的语句lambda还是返回分配给q的值的东西?两者都是合法的;我们应该选择哪个?

现在,您可能会说,嗯,就是不支持任何这些功能。仅支持可以计算出类型的“正常”情况。那没有帮助。这如何使我的生活更轻松?如果该功能有时有效并且有时会失败,那么我仍然必须编写代码以检测所有这些失败情况并为每种情况提供有意义的错误消息我们仍然必须指定所有行为,将其记录下来,为其编写测试,等等。这是一项非常昂贵的功能,可以节省用户六次击键的时间。与花大量时间编写测试用例相比,我们有一种更好的方法可以为语言增添价值,因为该功能不能在一半时间内起作用,并且在起作用的情况下几乎没有任何好处。

实际上有用的情况是:

var xAnon = (int y)=>new { Y = y };

因为那东西没有“可口”的类型。但是我们一直都有这个问题,我们只是使用方法类型推断来推断类型:

Func<A, R> WorkItOut<A, R>(Func<A, R> f) { return f; }
...
var xAnon = WorkItOut((int y)=>new { Y = y });

现在,方法类型推断可以算出func类型是什么。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么不能将项目分配给对象的常量?

为什么不能将背景颜色分配给视图

为什么不能将* Struct分配给* Interface?

为什么不能将lambda分配给Object?

为什么不能将数组的地址分配给指针?

为什么不能将方法引用直接分配给Object类型的变量?

为什么不能将类型的值分配给实现带有接收者类型指针的方法的接口?

为什么不能将类属性作为参数直接分配给类括号,而不是使用def __init__方法?

为什么不能将类型SFC <AnchorProps>分配给类型SFC <{}>?

为什么不能将函数分配给Object.prototype.click?

为什么不能将道具分配给常量并渲染它

为什么不能将子类型值分配给泛型类型?

为什么不能将BlockingCollection <T>分配给IReadOnlyCollection <T>?

为什么不能将Nothing分配给Unit类型的变量?

为什么不能将 std::bind 的结果分配给函数指针

为什么不能将正确结构的Typescript数组分配给看似兼容的元组

为什么不能将结构分配给具有其实现特征的绑定

在IntelliJ中,为什么不能将键映射分配给“最近打开”

为什么不能将工作项分配给团队成员?

为什么不能将基类对象分配给派生类对象?

为什么我不能将 new 创建的 &client 对象分配给 unique_ptr

为什么我不能将wordpress函数分配给变量?

为什么不能将字符串变量分配给 json::value 对象?

为什么不能将此DataGridViewComboBoxCell分配给我想要的单元格?

为什么不能将接口分配给Record <string,unknown>?

为什么我不能将数组分配给 Pandas DataFrame 列?

为什么不能将空代码块分配给Javascript中的变量?

为什么我不能将std :: from_chars的结果分配给std :: tie?

为什么我不能将图像分配给自定义收集CollectionViewCell