相关疑难解决方法(0)

不同FW的协方差导致代码中断?

我在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);
Run Code Online (Sandbox Code Playgroud)

使用C#3,它将调用: Base.Foo

使用C#4,它将调用: Child.Foo

我知道这是因为协方差

题 :

是不是有点代码破坏变化?有没有解决方法,所以这段代码将继续像第3版那样工作?

c# inheritance .net-4.0 covariance

4
推荐指数
2
解决办法
236
查看次数

派生方法比c#中的覆盖更强?

(再次烦人的问题......)

之前问过这个 - (这部分与我的问题有关) - 我得到了一个答案:

参见C#4规范的§7.6.5.1:

候选方法集合被简化为仅包含来自大多数派生类型的方法:对于集合中的每个方法CF,其中C是声明方法F的类型,所有在基本类型C中声明的方法都从集合.

好.

我有这个代码://.Dump() is like a WriteLine command...

 public class Base
    {
        public void Foo(string strings)  { "1".Dump();}
        public virtual void  Foo(object strings)  { "2".Dump();}
    }

    public class Child : Base
    {

        public override void  Foo(object strings)  { "4".Dump();}
    }
Run Code Online (Sandbox Code Playgroud)

但是这段代码:

Child c = new Child();
c.Foo("d");
Run Code Online (Sandbox Code Playgroud)

发出: "1"

可是等等 ...

我们不这么说is reduced to contain only methods from the most derived types:吗?

Child的父亲有一个函数public void Foo(string strings) …

.net c# clr .net-4.0

4
推荐指数
1
解决办法
389
查看次数

标签 统计

.net-4.0 ×2

c# ×2

.net ×1

clr ×1

covariance ×1

inheritance ×1