首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >协方差和逆方差匿名类型

协方差和逆方差匿名类型
EN

Stack Overflow用户
提问于 2012-03-17 09:19:57
回答 1查看 414关注 0票数 0

我在C#中读到,covariance and contravariance为数组类型、委托类型和泛型类型参数启用隐式引用转换。

我想知道我是否可以对匿名类型(直接从object派生的类类型)使用协方差和逆方差,以及它是如何工作的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-17 23:30:49

我可以对匿名类型使用泛型接口和委托的协变和逆变吗?

是。匿名类型是引用类型;方差只适用于引用类型。

是如何实现的?

接口协方差:

代码语言:javascript
复制
var sequenceOfAnonymous = from c in customers select new {c.Name, c.Age};
var sequenceOfObject = (IEnumerable<object>)sequenceOfAnonymous;

数组协方差:

代码语言:javascript
复制
var arrayOfAnonymous = sequenceOfAnonymous.ToArray();
var arrayOfObject = (object[]) arrayOfAnonymous;

要演示委托协方差,您需要使用泛型类型推断技巧:

代码语言:javascript
复制
static Func<R> MakeFunc(Func<R> f) { return f; }
...
var funcOfAnonymous = MakeFunc( ()=>new { X = 123 } );
var funcOfObject = (Func<object>)funcOfAnonymous;

接口反差需要一个稍有不同的技巧:通过示例进行转换:

代码语言:javascript
复制
interface IFrobber<in T> { void Frob(T t); }
class Frobber<T> : IFrobber<T> 
{ 
    public void Frob(T t) { Console.WriteLine(t); }
}
...
static IFrobber<T> FrobByExample<T>(IFrobber<T> frobber, T example) 
{ return frobber; }
...
var frobberOfObject = new Frobber<object>();
var frobberOfAnonymous = FrobByExample(frobberOfObject, new { X = 0 });

对于委托逆差也是如此:

代码语言:javascript
复制
static Action<A> ActionByExample<A>(Action<A> action, A example) 
{ return action; }
...
var actionOfObject = (Action<object>) x => { Console.WriteLine(x); }
var actionOfAnonymous = ActionByExample(actionOfObject, new { X = 0 } );

讲得通?

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9746433

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档