gpt4 book ai didi

c# - Func 委托(delegate)中的 out 参数修饰符 (C#)

转载 作者:行者123 更新时间:2023-12-02 13:42:01 24 4
gpt4 key购买 nike

我是 C# 初学者,只是一个关于 Func delegate 的问题:

public delegate TResult Func<in T,out TResult>(T arg);

我可以理解需要在 T 之前放置 in 关键字,因为我们不想修改源输入,但是 TResult 之前的 out 又如何呢?这不是意味着我们需要修改输出,但为什么呢?难道我们有时只是动态生成返回对象吗?假设我们有一个委托(delegate):

Func<string, bool> nameFilter = str => str[0] == 'S';

所以它检查一个字符串,看看它的第一个字符是否是“S”,然后返回 true 或 false,所以我们动态返回这个 bool 值,out 关键字在这里做什么?没有什么需要更改才能返回吗?

最佳答案

简短回答

您很少需要担心 inout Generic中的关键字类型定义。用 in 定义的类/out当您使用泛型类型参数时,它通常会“正常工作”,我敢打赌大多数开发人员永远不会在自己的代码中编写这样的定义。

较长的答案

要获得完整的解释,您应该阅读Covariance and ContravarianceVariance in Delegates 。我的答案的其余部分只是一些说明性示例代码。

为了简化说明,我将解释 inout分别通过 Action<T> Func<TResult> 而不是 Func<T,TResult> .

这些示例都使用以下两个类:

class BaseClass {}
class DerivedClass : BaseClass {}

协方差:out

对于这个例子,我模仿了 Func<out TResult> ,但删除了 out (协方差)修饰符来展示其效果。协方差允许我们使用返回 DerivedType 的函数。任何需要返回 BaseType 的函数的地方.

class CovarianceExamples
{
// This is similar to System.Func<out TResult>(), but with covariance removed
delegate TResult InvariantFunc<TResult>();

void InvariantFuncExample()
{
// Ignore the values of these variables; it's the types that are important
InvariantFunc<BaseClass> baseFunc = null;
InvariantFunc<DerivedClass> derivedFunc = null;

baseFunc = baseFunc; // Allowed
baseFunc = derivedFunc; // Not allowed; compile error!
}

void CovariantFuncExample()
{
// Ignore the values of these variables; it's the types that are important
Func<BaseClass> baseFunc = null;
Func<DerivedClass> derivedFunc = null;

baseFunc = baseFunc; // Allowed
baseFunc = derivedFunc; // Allowed
}
}

逆变:in

对于这个例子,我模仿了 Action<in T> ,但删除了 in (逆变)修饰符来展示其效果。逆变允许我们使用接受的操作BaseType任何需要接受 DerivedType 的操作的地方.

class ContravarianceExamples
{
// This is similar to System.Action<in T>(T), but with contravariance removed
delegate void InvariantAction<T>();

void InvariantActionExample()
{
// Ignore the values of these variables; it's the types that are important
InvariantAction<BaseClass> baseAction = null;
InvariantAction<DerivedClass> derivedAction = null;

baseAction = baseAction; // Allowed
derivedAction = baseAction; // Not allowed; compile error!
}

void ContravariantActionExample()
{
// Ignore the values of these variables; it's the types that are important
Action<BaseClass> baseAction = null;
Action<DerivedClass> derivedAction = null;

baseAction = baseAction; // Allowed
derivedAction = baseAction; // Allowed
}
}

关于c# - Func 委托(delegate)中的 out 参数修饰符 (C#),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55034549/

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