namespace DefaultNamespace { public class BaseClass {} public class ChildClass : BaseClass {} public delegate void CoVarianceHandler(ChildClass args); public delegate BaseClass ContraVarianceHandler(); public class Delegates { public event CoVarianceHandler CoVariance; public event ContraVarianceHandler ContraVariance; public void OnBaseClass(BaseClass args) {} public void OnChildClass(ChildClass args) {} public BaseClass OnReturnBaseClass() { return new BaseClass(); } public ChildClass OnReturnChildClass() { return new ChildClass(); } public void Init() { CoVariance += OnBaseClass; CoVariance += OnChildClass; CoVariance?.Invoke(new ChildClass()); // CoVariance?.Invoke(new BaseClass()); // is not working, because delegate expect an instance of ChildClass ContraVariance += OnReturnBaseClass; ContraVariance += OnReturnChildClass; BaseClass baseClass = ContraVariance?.Invoke(); // ChildClass childClass = ContraVariance?.Invoke(); // is not working, because delegate returns only an instance of BaseClass } } }