Ковариантность и контрвариантность делегатов

Рейтинг: 0Ответов: 1Опубликовано: 05.09.2014

Господа, по Шилдту прочитал о ковариантности и контрвариантности делегатов. И насколько я понял, то это совместимость аргументов или возвращаемых типов между базовыми и производными классами. Для примера решил написать простенький код. Но, исходя из того, что я понял, получается, что он не работает. Почему?

`

 using System;
class a
{
    public a Meth()
    {
        Console.WriteLine(1); return new a();
    }
}
class b : a
{
    public new b Meth()
    {
        Console.WriteLine(1); return new b();
    }
}
public delegate a Del();
class c
{
    static void Main()
    {
        Del D = new b().Meth;
        D();
    }
}

Ответы

▲ 4Принят

Немного подробнее о причинах ошибки. Итак, ошибка том, что у вашего делегата стоит модификатор public, тогда как у типа, являющегося возвращаемым значением этого делегата, модификатор internal (явно не указан, но стоит по умолчанию).

Вы спрашиваете:

Но ведь internal дает доступ внитри сборки - значит он должен быть виден

но ведь использовать этот делегат вы можете не только внутри сборки (на то он и public), однако, используя его в другой сборке, вы не смогли бы обратиться к его возвращаемому значению, поскольку из других сборок оно не может быть видимым. Собственно, добавив public для классов a и b, вы решите эту проблему. Точно так же вы решите ее, сделав ваш делегат internal - в таком случае отпадет проблема использования возвращаемого значения из других сборок.