我想编写一个仅将PerformanceCounterCategory作为参数的Action。我知道有动作<&gt ;, Func<>和代表们之间有一些区别,但我不确定它是什么。有人可以告诉我有什么区别(我在某地看过Action没有返回,或者这可能是Func)。
我正在尝试写下面的内容:
Action<PerformanceCounterCategory> action = (int > 5) ? action1 : action2;
action1和action2都是返回void但将PerformanceCounterCategory作为(唯一)参数的方法。
这是正确的方法吗?我不断收到有关方法组/ void等的错误,所以我不相信上面的代码对我的需求是最好的。
由于
答案 0 :(得分:6)
您需要施放一侧或其他 - 或者不使用条件运算符。
基本上,忽略赋值 - 因为编译器会这样做。它不会使用您尝试分配给变量来计算条件表达式类型的事实。我们只剩下:
(i > 5) ? action1 : action2
作为表达。那是什么类型的?方法组应转换为什么委托类型?编译器无法知道。如果您投射一个操作数,编译器可以检查另一个操作数是否可以转换:
(i > 5) ? (Action<PerformanceCounterCategory>) action1 : action2
可替换地:
Action<PerformanceCounterCategory> action = action2;
if (i > 5)
{
action = action1;
}
这很不幸,但这就是我害怕的生活:(
答案 1 :(得分:0)
首先回答有关Action
和Func
Action
返回空格。
Func
返回一个值。您将返回值的类型指定为第一个通用参数
Func<ReturnType, ParameterType1, ParameterType2...etc>
您的代码段存在两个问题。
(int&gt; 5)不起作用。 int是一种数据类型。您需要创建一个变量并检查它的值。
int myValue = 4;
... (myValue > 5) ? ... etc
使用条件运算符(?:)时,两个选项必须属于同一类型。如果action1和action2是不同的方法,则它们的类型不同(即使它们匹配同一个委托)。编译器将无法确定应将哪个转换为哪个。您需要做的是将一个委托给一个匹配另一个的委托,这样编译器就可以弄清楚如何将这两个转换为匹配的类型。
像这样:
Action<PerformanceCounterCategory> action = (int > 5) ? (Action<PerformanceCounterCategory>)action1 : action2;