gpt4 book ai didi

c# - 条件运算符和比较委托(delegate)

转载 作者:太空狗 更新时间:2023-10-29 22:27:48 26 4
gpt4 key购买 nike

给定两种比较方法的实现:

// compares by Key...
private static int CompareByKey(KeyValuePair<int, string> x, KeyValuePair<int, string> y)

{
return x.Key.CompareTo(y.Key);
}

// compares by Value...
private static int CompareByValue(KeyValuePair<int, string> x, KeyValuePair<int, string> y)
{
return x.Value.CompareTo(y.Value);
}

为什么以下条件运算符代码块不能编译:

Comparison<KeyValuePair<int, string>> sortMethod;
sortMethod = isSortByActualValue ? CompareByKey : CompareByValue;

编译器错误:“无法确定条件表达式的类型,因为‘方法组’和‘方法组’之间没有隐式转换”

但是,使用 if-else 的等效代码块没有任何问题:

Comparison<KeyValuePair<int, string>> sortMethod;
if (isSortByActualValue)
sortMethod = CompareByKey;
else
sortMethod = CompareByValue;

(以上两项作业都很好)

如果我转换比较委托(delegate),条件运算符也是如此:

Comparison<KeyValuePair<int, string>> sortMethod;
sortMethod = isSortByActualValue ? (Comparison<KeyValuePair<int, string>>) CompareByKey : CompareByValue;

(在上面的作业中一切都很好,即使只在真正的部分进行强制转换)

最佳答案

错误方法实际上说明了一切,但不是很直观。如果您使用方法名称而不调用该方法,则您正在处理一个方法组。 “组”,因为方法可以被重载,并且名称可以指示任何重载的方法。

现在,方法组可以隐式转换为具有匹配签名的委托(delegate),这就是为什么您在 if 中的赋值有效。

到目前为止,还不错。但是,条件运算符 ?: 需要推导出一个通用类型,它的第二个和第三个参数可以隐式转换为该类型,并且它不会为此考虑所有转换(这会产生各种问题)。它只是查看两个参数是否具有相同的类型,或者一个是否可以隐式转换为另一个。

这里不是这种情况:虽然两个参数都是方法组,但它们实际上是具有不同类型的不同方法组,并且您不能将一个方法组转换为另一个方法组。尽管两者都可以很容易地转换为委托(delegate),但编译器禁止这种用法。

其他类型也是如此,顺便说一句:

object = someBool ? "" : New List<Integer>();

也无法编译,原因相同。同样,我们可以通过将任一参数显式转换为公共(public)基类型来进行编译:

object = someBool ? (object) "" : New List<Integer>();

关于c# - 条件运算符和比较委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9488356/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com