C# 用抛出表达式附加事件

C# 用抛出表达式附加事件,c#,C#,我正在轻松地使用C#7,但我的第一个抛出表达式无法编译。这个怎么了 view.SelectionChanged += something == true ? OnSelectionChanged : throw new InvalidOperationException(); 编译器错误为: 无法确定条件表达式的类型,因为“方法组”和“”之间没有隐式转换 将新的InvalidOperationException()替换为 (sender,args)=&g

我正在轻松地使用C#7,但我的第一个抛出表达式无法编译。这个怎么了

view.SelectionChanged +=
    something == true
        ? OnSelectionChanged
        : throw new InvalidOperationException();
编译器错误为:

无法确定条件表达式的类型,因为“方法组”和“”之间没有隐式转换


将新的InvalidOperationException()替换为

(sender,args)=>{throw new InvalidOperationException()}
或者通过以下方式启用“使用c#7构建”: 转到项目属性->构建->高级->语言版本设置为c#7.0

这将不起作用,因为未指定方法组的签名<代码>操作用作方法组。
OnAction
的类型为“方法组”,并且可能存在多个
OnAction
重载,因此编译器无法推断它:

public void M() 
{
    var item = Console.Read();
    Func<object, object> ok = OnAction; // will work
    Func<object, object> handler = 
        item == 1 ? OnAction : throw new Exception(); // will not work
}

public static Object OnAction(object y)
{
    return "";
}
public void M()
{
var item=Console.Read();
Func ok=OnAction;//将起作用
Func处理程序=
item==1?OnAction:抛出新异常();//将不起作用
}
公共静态对象OnAction(对象y)
{
返回“”;
}
要修复它,我们需要做的就是指定方法组的签名,以便编译器准确地知道哪一个:

Func<object, object> handler = 
    item == 1 ? (Func<object, object>)OnAction : throw new Exception();
Func处理程序=
项目==1?(Func)OnAction:抛出新异常();
因此,要解决您的问题,我不确定什么是
SelectionChanged
,但您需要提供其签名,这将解决问题

请注意,此错误不是C#7.0特有的。即使没有抛出表达式的较低版本也会产生相同的错误


这不是lambda。您是否已将项目的编译设置为使用c#7进行编译?@s.Petrosov不知道您的意思。我正在使用VS 2017。这将代码的含义更改为不正确的行为。该项目已设置为
默认值
,在VS 2017中为C#7。@HappyNomad,据我所知,默认值不是C#7。这很奇怪,因为我在同一项目中使用了其他C#7功能。