//И это вполне допустимо как при наличии контравариантности, так и без нее. IMyContraVarGenIF
// Создать ссылку из интерфейса IMyContraVarGenIF
7/ на объект типа MyClass
// *** Это вполне допустимо благодаря контравариантности. *** IMyContraVarGenIF
// Этот вызов допустим как при наличии контравариантности, так и без нее.
BetaRef.Show(new Beta);
// Присвоить переменную AlphaRef переменной BetaRef.
// *** Это вполне допустимо благодаря контравариантности. ***
BetaRef = AlphaRef;
BetaRef.Show(new Beta );
Прежде всего, обратите внимание на создание двух переменных ссылочного типа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 {