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>' 
        }
    }
}

論理的に言えば、 abはであるためa、 awrapper<b>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は ですが、awrapper<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 Dogwrapper<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 に答える