Так что я делегат определяется как:Понимание делегат контрвариантность полезность
public delegate void MyDelegate<T>(T myParameter);
Resharper предполагает, что я должен сделать T
контравариантного следующим образом:
public delegate void MyDelegate<in T>(T myParameter);
Теперь у меня есть трудное время понять, что это это хорошо? Я знаю, что это мешает мне сделать возвращаемый тип, но кроме этого, какие полезные ограничения я получу, делая T
контравариантным? То есть, когда пришло время использовать делегат с экземпляром, какие экземплярами я могу создать с
public delegate void MyDelegate<T>(T myParameter);
, что я не могу создать с
public delegate void MyDelegate<in T>(T myParameter);
Я лучше понимаю, что он делает. Но я все еще не понимаю, зачем мне использовать маркер 'in'. «Button» и «Label» расширяют «Control». Таким образом, ваш код никогда не приведет к ошибкам несовместимости (с маркером «in» или без него). Почему маркер 'in' просто не подразумевается? – AxiomaticNexus
@ YasmaniLlanes Поскольку, если делегат возвращает тип этого параметра или тип, основанный частично на нем, делегат больше не является логически контравариантным. Также возможно, что кто-то конкретно хочет запретить эту способность, которую они могли бы сделать, намеренно сделав ее неконтравариантной. – Servy
@YasmaniLlanes Отличный вопрос. Хотя ваше предложение имеет смысл в теории, Эрик Липперт предлагает несколько прагматических причин необходимости маркеров 'in' и' out' в своем блоге здесь: http://blogs.msdn.com/b/ericlippert/archive/2007/10 /29/covariance-and-contravariance-in-c-part-seven-why-do-we-need-a-syntax-at-all.aspx –