首页 新闻 会员 周边

泛型委托里面参数的定义前面加in和out是什么含义

0
[已解决问题] 解决于 2023-06-26 08:47

public delegate TResult Func<in T1, in T2, out TResult>(T1 arg1, T2 arg2);

泛型委托里面参数的定义前面加in和out是什么含义

  1. 可以去掉in 和out 吗

2.是不是输入函数一定要用in,输出参数返回值一定要用out

3.以下定义可以吗,如果这样定义,T1和T2还是输入参数吗,TResult还是输出参数返回值吗
public delegate TResult Func<out T1, out T2, in TResult>(T1 arg1, T2 arg2);

999999999999999的主页 999999999999999 | 初学一级 | 园豆:3
提问于:2023-06-25 12:06
< >
分享
最佳答案
0

在泛型委托中,参数定义前面的关键字 in 和 out 是用来限定参数的协变性(covariance)和逆变性(contravariance)。

in 关键字表示参数是逆变的。它可以用于输入参数,表示该参数只能作为输入,即方法可以接受参数的派生类型。在泛型委托中,使用 in 关键字的参数表示方法中的输入参数。

out 关键字表示参数是协变的。它可以用于输出参数和返回值,表示该参数只能作为输出,即方法可以返回参数的基类型。在泛型委托中,使用 out 关键字的参数表示方法中的输出参数和返回值。

不可以去掉 in 和 out 关键字,因为它们定义了参数的协变性和逆变性,从而保证了泛型委托的类型安全性和一致性。

对于以下定义:

csharp
Copy code
public delegate TResult Func<out T1, out T2, in TResult>(T1 arg1, T2 arg2);
这样的定义是不正确的,因为 out 关键字只能用于输出参数和返回值,而 in 关键字只能用于输入参数。根据标准的 Func 委托定义,TResult 应该是输出类型,而 T1 和 T2 应该是输入类型。

正确的定义应该是:

csharp
Copy code
public delegate TResult Func<in T1, in T2, out TResult>(T1 arg1, T2 arg2);
这样定义表示 T1 和 T2 是输入参数,而 TResult 是输出类型。

总结:

in 关键字用于输入参数,表示参数的逆变性。
out 关键字用于输出参数和返回值,表示参数的协变性。
泛型委托的参数定义必须使用正确的关键字,以确保类型的一致性和安全性。

奖励园豆:5
Technologyforgood | 大侠五级 |园豆:5992 | 2023-06-25 23:03
其他回答(1)
0

这是逆变与协变,参考园子里的博文:逆变与协变详解

dudu | 园豆:30948 (高人七级) | 2023-06-25 12:24
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册