0

给定以下代码:

namespace sample
{
    class a { }

    class b : a { }

    public class wrapper<T> { }

    class test
    {
        void test1()
        {
            wrapper<a> y = new wrapper<b>();
            //Error 11  Cannot implicitly convert type 'sample.wrapper<sample.b>' to 'sample.wrapper<sample.a>' 
        }
    }
}

从逻辑上讲,a 因为ba,awrapper<b>是 a wrapper<a>。那为什么我不能进行这种转换,或者我该怎么做呢?

谢谢。

4

3 回答 3

3

因为 b 是 a,所以 awrapper<b>是 awrapper<a>

好吧,对于 .NET 泛型类来说,情况并非如此,它们不能是协变的。您可以使用接口协方差实现类似的功能:

class a { }
class b : a { }

public interface Iwrapper<out T> { }
public class wrapper<T> : Iwrapper<T> {}

class test
{
    void test1()
    {
        Iwrapper<a> y = new wrapper<b>();
    }
}
于 2012-12-11T12:54:36.157 回答
1

这是一个协方差问题。

b是一个a,但wrapper<b>不是一个wrapper<a>

您可以使用 C# 4 的协方差语法来允许它,如下所示:

public interface IWrapper<out T> { ... }

public class Wrapper<T> : IWrapper<T> { ... }

这将指示 CLR 将其Wrapper<B>视为Wrapper<A>.

(作为记录:C# 有大写约定;类名是 Pascal 大小写的)。

于 2012-12-11T12:53:59.543 回答
0

让我们做一个场景。让我们调用类a Mammal,类b Dog,然后说wrapper<T>类是List<T>

看看这段代码发生了什么

List<Dog> dogs = new List<Dog>();  //create a list of dogs
List<Mammal> mammals = dogs;   //reference it as a list of mammals

Cat tabby = new Cat();
mammals.Add(tabby)   // adds a cat to a list of dogs (!!?!)

Dog woofer = dogs.First(); //returns our tabby
woofer.Bark();  // and now we have a cat that speaks foreign languages

(我对如何将基类儿童存储在字典中的答案的解释?

于 2012-12-11T13:02:45.853 回答