动作返回void并使用三元运算符获取参数

时间:2009-11-19 22:33:19

标签: c#

我想编写一个仅将PerformanceCounterCategory作为参数的Action。我知道有动作<&gt ;, Func<>和代表们之间有一些区别,但我不确定它是什么。有人可以告诉我有什么区别(我在某地看过Action没有返回,或者这可能是Func)。

我正在尝试写下面的内容:

Action<PerformanceCounterCategory> action = (int > 5) ? action1 : action2;

action1和action2都是返回void但将PerformanceCounterCategory作为(唯一)参数的方法。

这是正确的方法吗?我不断收到有关方法组/ void等的错误,所以我不相信上面的代码对我的需求是最好的。

由于

2 个答案:

答案 0 :(得分:6)

您需要施放一侧或其他 - 或者不使用条件运算符。

基本上,忽略赋值 - 因为编译器会这样做。它不会使用您尝试分配给变量来计算条件表达式类型的事实。我们只剩下:

(i > 5) ? action1 : action2

作为表达。那是什么类型的?方法组应转换为什么委托类型?编译器无法知道。如果您投射一个操作数,编译器可以检查另一个操作数是否可以转换:

(i > 5) ? (Action<PerformanceCounterCategory>) action1 : action2

可替换地:

Action<PerformanceCounterCategory> action = action2;
if (i > 5)
{
    action = action1;
}

这很不幸,但这就是我害怕的生活:(

答案 1 :(得分:0)

首先回答有关ActionFunc

之间差异的问题
  • Action返回空格。

  • Func返回一个值。您将返回值的类型指定为第一个通用参数

Func<ReturnType, ParameterType1, ParameterType2...etc>

您的代码段存在两个问题。

  1. (int&gt; 5)不起作用。 int是一种数据类型。您需要创建一个变量并检查它的值。

    int myValue = 4;
    ... (myValue > 5) ? ... etc

  2. 使用条件运算符(?:)时,两个选项必须属于同一类型。如果action1和action2是不同的方法,则它们的类型不同(即使它们匹配同一个委托)。编译器将无法确定应将哪个转换为哪个。您需要做的是将一个委托给一个匹配另一个的委托,这样编译器就可以弄清楚如何将这两个转换为匹配的类型。

  3. 像这样:

    Action<PerformanceCounterCategory> action = (int > 5) ? (Action<PerformanceCounterCategory>)action1 : action2;