【问题标题】:Attach event with Throw Expression使用 Throw 表达式附加事件
【发布时间】:2017-05-21 16:06:06
【问题描述】:

我正在使用 C# 7,但我的第一个 Throw 表达式无法编译。这有什么问题?

view.SelectionChanged +=
    something == true
        ? OnSelectionChanged
        : throw new InvalidOperationException();

编译器错误是:

条件表达式的类型无法确定,因为'method group'和''之间没有隐式转换

【问题讨论】:

  • 那不是 lambda。
  • 你是否将项目的编译设置为使用 c# 7 编译?
  • @S.Petrosov 不明白你的意思。我正在使用 VS 2017。

标签: c#


【解决方案1】:

这将不起作用,因为未指定方法组的签名。 OnAction 用作方法组。 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 "";
}

要修复它,我们需要做的就是指定方法组的签名,以便编译器准确地知道是哪一个:

Func<object, object> handler = 
    item == 1 ? (Func<object, object>)OnAction : throw new Exception();

所以要解决您的问题,我不确定SelectionChanged 是什么,但您需要提供其签名,这样才能解决问题。

请注意,此错误并非特定于 C# 7.0。即使是没有 throw 表达式 的低版本也会产生同样的错误。

<== Fiddle Me ==>

【讨论】:

    【解决方案2】:

    throw new InvalidOperationException() 替换为

    (sender,args)=>{throw new InvalidOperationException()}
    

    或者以这种方式开启使用 c# 7 构建: 转到 Project Properties->Build->Advanced -> Language Version 设置为 c# 7.0

    【讨论】:

    • 这会将代码的含义更改为不正确的行为。
    • 该项目已设置为default,在 VS 2017 中为 C# 7。
    • @HappyNomad 我知道默认不是 C# 7
    • 这很奇怪,因为我在同一个项目中使用了其他 C# 7 功能。
    猜你喜欢
    • 2012-03-21
    • 1970-01-01
    • 1970-01-01
    • 2020-01-12
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多