关键字"in"和"out"在泛型委托中是否多余?



我想知道为什么关键字"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);

它们都以相同的结果进行编译。显然,编译器将(....( 内的所有标识符都为"in",返回类型在前面的委托名称为"out",因此使用"in"和"out"是多余的里面<....>。事实上,如果您错误地使用"in"和"out"则编译器将不会编译。那么拥有它们有什么意义首先?

首先拥有它们有什么意义?

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

它们无法推断,因为(1(我知道没有一般的机制来进行这种推断;如果你愿意,可以随意提出一个,(2(因为当一个小的变化一个地方无形地导致类型兼容性的深远变化时,这是一种糟糕的用户体验。

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

从这里开始:

https://blogs.msdn.microsoft.com/ericlippert/2007/10/16/covariance-and-contravariance-in-c-part-one/

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

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

// 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; 

它们不一样;inout有意义。

最新更新