C# 关键词是什么;在;及;“出去”;泛型委托中的冗余?

C# 关键词是什么;在;及;“出去”;泛型委托中的冗余?,c#,C#,我想知道为什么“in”和“out”这两个关键词甚至在一般委托中使用,例如 public delegate TResult Func1<in T1, in T2, out TResult>(T1 arg1, T2 arg2); public delegate TResult Func2<in T1, TResult, T2>(T1 arg1, T2 arg2); public delegate TResult Func3<TResult, T2, T1>(

我想知道为什么“in”和“out”这两个关键词甚至在一般委托中使用,例如

 public delegate TResult Func1<in T1, in T2, out TResult>(T1 arg1, T2 arg2);
 public delegate TResult Func2<in T1, TResult, T2>(T1 arg1, T2 arg2);
 public delegate TResult Func3<TResult, T2, T1>(T1 arg1, T2 arg2);
public委托TResult Func1(T1 arg1,T2 arg2);
公共委托TResult Func2(T1 arg1,T2 arg2);
公共委托TResult Func3(T1 arg1,T2 arg2);
它们都以相同的结果编译。显然,编译器处理 (..)中的所有标识符都是“in”,前面是返回类型 将代理名称的名称改为“out”,因此使用“in”和“out”是多余的 在…内事实上,如果你用错了“in”和“out” 那么编译器将不会编译。那么拥有它们有什么意义呢 首先

首先拥有它们有什么意义

允许开发人员描述他们关于委托和接口类型的协变和逆变的意图,并确保编译器检查所表达意图的正确性

它们不能被推断,因为(1)我不知道进行这种推断的一般机制;如果您愿意,可以随意提出一个建议,(2)因为当一个地方的微小更改无形中导致其他地方的类型兼容性发生深远变化时,这是一种糟糕的用户体验

如果您对本主题感兴趣,那么您应该阅读我的十一部分系列文章,了解我们是如何设计和实现该功能的

从这里开始:


与您的问题特别相关的文章是第七部分。

让我们举一个简单的例子:

// concatenate the two object parameters with a separator to create a string
Func1<object, object, string> f1 = (s1, s2) => s1 + ":" + s2;
Func3<object, object, string> f3 = (s1, s2) => s1 + ":" + s2;

// this is fine; any string is also an object, so the "in" is satisfies
// the two parameters, and the "out" satisfies the return value - as
// such, the delegate can be implicitly cast using the variance rules
Func1<string, string, object> x1 = f1;

// this is not fine; the assignment is invalid
Func3<string, string, object> x3 = f3; 
//用分隔符连接两个对象参数以创建字符串
Func1 f1=(s1,s2)=>s1+“:”+s2;
Func3 f3=(s1,s2)=>s1+“:”+s2;
//这很好;任何字符串也是一个对象,因此“in”是
//这两个参数和“out”满足返回值-as
//这样,可以使用差异规则隐式转换委托
Func1-x1=f1;
//这不好,;分配无效
Func3 x3=f3;

他们不一样;
in
out
有意义。

当您查看该功能的文档时,您发现了什么,这是如何无法回答您的问题的?文档的可能副本只涉及“in”和“out”的含义,而不涉及明确关键字的需要。如果下雨时你需要一把雨伞,那么这并不意味着你必须在雨伞上放一个大的标志雨伞
out
对方法参数有一种意义,对泛型类型参数有另一种意义<中的代码>仅对泛型类型参数有意义。这些含义都与您似乎认为它们的含义无关(*“委托名称前面的返回类型”?)。请阅读文档。这不是指定哪些类型用于参数,哪些类型用于返回值的问题。“out”表示“可以在逆变转换中使用,因为它是返回类型”。如果你不明白协方差和逆变换是什么,那就先了解它们。