我在 NDC 2010 上看过 Jon Skeet 的演讲
他提到了一些有趣的事情:
public Class Base
{
public void Foo(IEnumerable<string> strings){}
}
public Class Child:Base
{
publc void Foo(IEnumerable<object> objects) {}
}
Main :
List<string> lst = new List<string>();
lst.Add("aaa");
Child c = new Child();
c.Foo(lst);
使用 C# 3 它将调用:Base.Foo
对于 C# 4,它将调用:Child.Foo
我知道这是因为协方差
问题 :
这不是一个破坏代码的改变吗?
是否有任何解决方法可以让此代码继续像版本 3 上一样工作?
是的,这是一个突破性的改变。每当您将以前无效的转换变为合法时,这都是一个重大更改。
不幸的是,如果不做任何事情,就很难向该语言添加功能。any重大变化。如果您了解 C# 4 中的事件,还有更多内容really想寻找他们。当然,这些不太可能影响大多数开发人员。
C# 1 和 C# 2 之间也存在类似的重大更改,其中所使用的实现在该代码的不同版本之间会发生变化:
using System;
public delegate void StringAction(string x);
public class Base
{
public void Foo(string x)
{
Console.WriteLine("Base");
}
}
public class Child : Base
{
public void Foo(object x)
{
Console.WriteLine("Child");
}
}
public class Test
{
static void Main()
{
Child c = new Child();
StringAction action = new StringAction(c.Foo);
action("x");
}
}
在这种情况下,编译器实际上会给出警告:
Test.cs(26,31): warning CS1707: Delegate 'StringAction' bound to
'Child.Foo(object)' instead of 'Base.Foo(string)' because of new
language rules
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)