我没有参加PDC 2008,但我听到一些消息称C#4.0被宣布支持Generic协方差和反差异.也就是说,List<string>可以分配给List<object>.怎么会这样?
在Jon Skeet的C#深度书中,解释了为什么C#泛型不支持协方差和反方差.它主要用于编写安全代码.现在,C#4.0改为支持它们.它会带来混乱吗?
有人知道有关C#4.0的细节可以给出一些解释吗?
假设我有以下三个类/接口:
public interface IImportViewModel
{
}
public class TestImportViewModel : IImportViewModel
{
}
public class ValidationResult<TViewModel> where TViewModel : IImportViewModel
{
}
Run Code Online (Sandbox Code Playgroud)
由于TestImportViewModel实现了IImportViewModel,为什么以下不能编译?
ValidationResult<IImportViewModel> r = new ValidationResult<TestImportViewModel>();
Run Code Online (Sandbox Code Playgroud)
我理解错误消息"无法将类型'ValidationResult'隐式转换为'ValidationResult'"的含义.我只是不明白为什么会这样.这不是协方差吗?
我有一个通用类Zone<T> where T: Media.Medium。在这个类中,我有一个方法public void AddNode(Node node),其中有一个node.ParentZone = this引发此编译器错误的语句:
无法将类型“Zone< T >”隐式转换为“Zone< Media.Medium >”
但我不明白为什么 aspublic abstract class Node有public Zone<Media.Medium> ParentZone字段和类Zone<T> where T: Media.Medium受 约束where T: Media.Medium,所以 TMedia.Medium在任何情况下都是 a 。
这是独立的代码:(完整Zone<T>且相关部分Node)
public class Zone<T> where T: Media.Medium
{
public readonly Type MediaType = typeof(T);
public readonly Guid ID = new Guid();
private readonly List<Node> _nodes = new List<Node>();
public void …Run Code Online (Sandbox Code Playgroud)