【问题标题】:Is there a way to determine the Variance of an Interface / Delegate in C# 4.0?有没有办法在 C# 4.0 中确定接口/委托的方差?
【发布时间】:2010-05-27 04:19:23
【问题描述】:

现在我们在 C# 中的接口和委托上有了通用协变和逆变,我只是好奇如果给定一个 Type,你可以计算出它的通用参数的协变/逆变。我开始尝试编写自己的实现,它会查看给定类型的所有方法,并查看返回类型和/或参数是否与泛型参数中的类型匹配。问题是,即使我有这个:

public interface IFoo<T>
{
   void DoSomething(T item);
}

使用我的逻辑,它看起来应该是逆变的,但是因为我们实际上并没有指定:

public interface IFoo<in T>
{
   void DoSomething(T item);
}

(in 参数)它实际上不是逆变的。这引出了我的问题:有没有办法确定泛型参数的方差?

【问题讨论】:

  • 你为什么需要那个?
  • @Mitch 我会在我弄清楚时告诉你:) 我只是出于好奇...
  • @MitchWheat 我今天用它来仔细检查我正在拉入 linqpad 脚本的库中的接口真的是协变的,因为我尝试的其他东西不会'编译。就是这样。
  • 听起来很复杂……对我的小脑来说太复杂了……

标签: c# reflection covariance contravariance


【解决方案1】:

我不知道你为什么想要这个,但是你可以从类型之外通过反射来查看它。以下是有关使用反射查看类型的通用参数的信息:

http://msdn.microsoft.com/en-us/library/b8ytshk6.aspx

具体来说,您从调用 Type.GetGenericParameters 返回的类型的属性 Type.GenericParameterAttributes 将显示泛型参数的 Co/Contravariance 属性...这是一个按位枚举,将显示此信息的组合:

http://msdn.microsoft.com/en-us/library/system.reflection.genericparameterattributes.aspx

真的很有趣...感谢您提出这个问题并让我查找它。

【讨论】:

  • 正是我想要的。另一个有趣的事情是,如果您查看第二个链接,它会说它从 .Net 2.0 开始就受支持。我想它一直存在,因为其他语言已经支持协变/逆变有一段时间了(我认为......)。从来没有注意到......
  • @BFree:有趣的观察。我得把它留到以后再研究。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多