Прежде всего, обратите внимание на создание двух переменных ссылочного типаIMyContraVarGenlF,которым присваиваются ссылки на объекты классаMyClass,где параметры типа совпадают с аналогичными параметрами в интерфейсных ссылках. В первом случае используется параметр типаAlpha,а во втором — параметр типаBeta.Эти объявления не требуют контравариантности и допустимы в любом случае.
Далее создается переменная ссылочного типаIMyContraVarGenIF
Как и следовало ожидать, следующая строка, в которой вызывается методBetaRef. Show() с аргументомBeta,является вполне допустимой. ВедьBeta— это обобщенный типТв классеMyClass
В следующей строке переменнаяAlphaRefприсваивается переменнойBetaRef.Эта операция вполне допустима лишь в силу контравариантности. В данном случае переменная относится к типуMyClass
Ради большей наглядности примера вся рассмотренная выше последовательность операций собрана ниже в единую программу.
// Продемонстрировать контравариантность в обобщенном интерфейсе, using System;
// Это обобщенный интерфейс, поддерживающий контравариантность. public interface IMyContraVarGenIF
}
// Реализовать интерфейс IMyContraVarGenlF. class MyClass
public void Show(T x) { Console.WriteLine(x); }
}
// Создать простую иерархию классов, class Alpha {
public override string ToStringO { return "Это объект класса Alpha.";
}
// ...
}
class Beta : Alpha {
public override string ToStringO { return "Это объект класса Beta.";
}
// ...
}
class VarianceDemo { static void Main() {
// Создать ссылку из интерфейса IMyContraVarGenIF
//на объект типа MyClass
// Это вполне допустимо как при наличии контравариантности, так и без нее. IMyContraVarGenIF
// Создать ссылку из интерфейса IMyContraVarGenIF
// на объект типа MyClass
//И это вполне допустимо как при наличии контравариантности,
// так и без нее.