visualstudio2010与c#4.0新特性--variance-变性

尹成 尹成     2022-12-07     793

关键词:

 

Variance变性
泛型的某个方面会让人感到奇怪,比如下面的代码是不合法的——

IList<string> strings = new List<string>();  
IList<object> objects = strings; 

第二个赋值是不允许的,因为strings和objects的元素类型并不一样。这样做有这充分的原因。如果允许那样写的话,你可能会写——

objects[0] = 5;
string s = strings[0];
 
这会允许将int插入strings列表中,然后将其作为string取出。这会破坏类型安全。

然而,对于某些接口来说上述情况并不会发生,尤其是不能将对象插入集合时。例如IEnumerable<T>就是这样的接口。如果改为——

IEnumerable<object> objects = strings;
 
这样就没法通过objects将错误类型的东西插入到strings中了,因为objects没有插入元素的方法。变性(variance)就是用于在这种能保证安全的情况下进行赋值的。结果就是很多之前让我们感到奇怪的情况现在可以工作了。

Covariance
协变性

在.NET 4.0中,IEnumerable<T>接口将会按照下面的方式进行定义——

public interface IEnumerable<out T> : IEnumerable

  IEnumerator<T> GetEnumerator();

public interface IEnumerator<out T> : IEnumerator

  bool MoveNext();
  T Current get;

 
这些声明中的“out”指出T只能出现在接口的输出位置——如果不是这样的话,编译器会报错。有了这一限制,接口对于T类型就是“协变的”,这意味着如果A可以按引用转换为B,则IEnumerable<A>可以当作IEnumerable<B>使用。

其结果是,任何一个字符串序列也就是一个对象序列了。

这很有用,例如在LINQ方法中。使用上面的定义——
var result = strings.Union(objects);
之前这样做是不允许的,你必须做一些麻烦的包装,使得两个序列具有相同的元素类型。

Contravariance
逆变性

类型参数还可以具有“in”修饰符,限制它们只能出现在输入位置上。例如IComparer<T>——

public interface IComparer<in T>

  public int Compare(T left, T right);

 
其结果有点让人迷惑,就是IComparer<object>可以作为IComparer<string>使用!这样考虑这个结果就会很有意义——如果一个比较器可以比较任意两个object,它当然也可以比较两个string。这种性质被称作“逆变性(contravariance)”。
泛型类型可以同时拥有带有in和out修饰符的类型参数,例如Func<...>委托类型——
public delegate TResult Func<in TArg, out TResult>(TArg arg);
很明显参数永远都是传入的,而结果永远只能是传出的。因此,Func<object, string>可以用作Func<string, object>。

 

具体时间代码见下面,在VS2010与 windows7的环境调试成功

 

 

 

 

visualstudio2010新特性

Visual Studio2010看起来非常强大,改变也很大。具体内容可参看这两篇blog文章:http://blogs.msdn.com/terryclancy/archive/2009/05/19/visual-studio-2010-new-features-extensibility-points-and-partner-opportunities.aspxhttp://blog 查看详情

VB 2010 中的 Object 是不是获得了与 C# 4.0 中的动态相同的优化?

...问题描述】:有人争辩说,C#4.0中使用dynamic关键字引入的特性与VB的“一切都是对象”特性相同。 查看详情

本人新书<visualc#2010开发权威指南;出版-感谢大家一如既往的支持-感谢csdn总裁蒋涛以及他率领的csdn团队提供的支持!

.../11111014.html《visualc#2010开发权威指南》 第1章.net4.0框架和visualstudio2010开发工具 1.1visualstudio2010开发平台 1.2.net4.0框架概览和新特性 第2章c#4.0新特性概览和visualc#2010新体验 2.1c#4.0新特性概览 2.2创建visualc#2010应用程序  查看详情

从vs2010跳跃到vs2017

VisualStudio配色方案https://studiostyl.es/C#语言新特性C#4.0:http://www.cnblogs.com/yangqi/archive/2010/07/16/1778767.htmlC#5.0:http://www.cnblogs.com/TianFang/archive/2012/08/19/2646146.htmlC#6.0:https://docs. 查看详情

c#4.0新特性dynamic(待学习)

随便翻看了一下dynamic,在网上拷贝了一个例子,先贴出来等有空了再慢慢消化staticvoidMain(string[]args){dynamicd=newMyDynamicObject();d.Mytable="ojlovecd";d.ojlovecd="wang";Console.WriteLine(d.Mytable);//新加的字段,VS不会自动提示Console.WriteLine( 查看详情

一个列子演示vs2010c++新特性

...格了XP装了win7,前段时间看了C++0X标准以及VS2010诱人的新特性,不禁心痒痒在线安装了VS2010,然后手写了这个列子用来测试新增的特性。struct _SUT{    int _a;    char _c;};int _tmain(int&n 查看详情

visualstudio2017针对移动开发的新特性介绍

VisualStudio是世界上最好的IDE之一,如果是.NET世界,那就没有之一了(^_^),而最近推出的VisualStudio2017在移动平台方面更是加强了这一点。这个版本包含了一些非常棒的功能,包括实时单元测试、新的重构、代码提示、C#7.0的支持... 查看详情

vs2010里的调试->启动新实例是干嘛的?和直接f5有啥区别?

...的动态类型和动态编程; (2)多显示器支持;  (3)使用VisualStudio2010的特性支持TDD;  (4)支持Office;  (5)QuickSearch特性;直接F5则跳过此步骤,直接调试。 查看详情

visualstudio2017针对移动开发的新特性介绍

...萄城控件技术团队博客,更多更好的原创文章尽在这里~~VisualStudio是世界上最好的IDE之一,如果是.NET世界,那就没有之一了(^_^),而最近推出的VisualStudio2017在移动平台方面更是加强了这一点。这个版本包含了一些非常棒的功能,... 查看详情

Subsonic 是不是与 .Net 4.0 兼容

...:2010-03-1114:17:38【问题描述】:最新版本的Subsonic是否与VisualStudio2010/.Net4.0兼容?【问题讨论】:【参考方案1】:是的,Subsonic3在.NET4中应该可以正常工作。我正在使用Subsonic3在VS.NET2 查看详情

深入研究visualstudio2017rc新特性

在【Xamarin+Prism开发详解三:Visualstudio2017RC初体验】中分享了Visualstudio2017RC的大致情况,同时也发现大家对新的VisualStudio很是感兴趣。于是发时间深入研究了一下VisualStudio2017RC是不是和微软Connect()://2016上说得一样神。总共列出了1... 查看详情

11g新特性与12c新特性

1.11g新特性概图 管理新特性> 开发新特性>     2.12c新特性概图  查看详情

转换为 Visual Studio 2010 / .Net 4.0 后 app.config “找不到架构信息”

】转换为VisualStudio2010/.Net4.0后app.config“找不到架构信息”【英文标题】:app.config"Couldnotfindschemainformation"afterconvertingtoVisualStudio2010/.Net4.0【发布时间】:2011-03-1113:34:06【问题描述】:将我的项目升级到VisualStudio2010和.Net4.0... 查看详情

c#7.0中有新特性

以下将是C#7.0中所有计划的语言特性的描述。随着VisualStudio“15”Preview4版本的发布,这些特性中的大部分将活跃起来。现在是时候来展示这些特性,你也告诉借此告诉我们你的想法!C#7.0增加了许多新功能,并专注于数据... 查看详情

我可以使用 Visual Studio 2010 而不升级到 .NET Framework 4.0 吗?

】我可以使用VisualStudio2010而不升级到.NETFramework4.0吗?【英文标题】:CanIuseVisualStudio2010andnotupgradeto.NETFramework4.0?【发布时间】:2010-05-1714:45:15【问题描述】:我有许多针对.NETFramework3.5的VisualStudio2008Web项目。我想开始使用VisualStud... 查看详情

c#7.0中有哪些新特性?

以下将是C#7.0中所有计划的语言特性的描述。随着VisualStudio“15”Preview4版本的发布,这些特性中的大部分将活跃起来。现在是时候来展示这些特性,你也告诉借此告诉我们你的想法!C#7.0增加了许多新功能,并专注于数据... 查看详情

如何使用 Visual Studio 2010 将项目从 .Net 2.0 升级到 .Net 4.0?

】如何使用VisualStudio2010将项目从.Net2.0升级到.Net4.0?【英文标题】:HowUpgradeAProjectFrom.Net2.0To.Net4.0UsingVisualStudio2010?【发布时间】:2012-10-0112:56:13【问题描述】:我是一名c#web开发人员,vb.net项目对我来说并不熟悉。我在.net2.0中有... 查看详情

c#7.0语言新特性

...关于在C#7.0语言中计划功能的说明。其中大部分功能在VisualStudio“15”Preview4中能运行。现在是最好的试用时期,请记录下你们的想法。C#7.0语言增加了许多的新功能,促使专注于数据消费,简化代码和性能。或许最大的... 查看详情