What is Covariance and Contravariance in C#: A Complete Overview

Поделиться
HTML-код
  • Опубликовано: 23 ноя 2024

Комментарии • 59

  • @zoran-horvat
    @zoran-horvat  Год назад +3

    Become a patron and get access to source code and exclusive live streams: www.patreon.com/posts/what-is-and-in-c-81378570

  • @TrungTran-rz6tz
    @TrungTran-rz6tz 2 года назад +31

    I felt off my chair when he said "it is very simple indeed" at the end

    • @zoran-horvat
      @zoran-horvat  2 года назад +6

      I couldn't resist, sorry :)

    • @dererzherzog
      @dererzherzog Год назад +4

      Hahaha, me too! But admittedly, it did get a lot less confusing after this video

    • @patricknelson
      @patricknelson 10 месяцев назад

      Ok, so… I wasn’t the only one. 😂

    • @VincentYang024
      @VincentYang024 6 месяцев назад

      I have to refresh this whenever I want to use these terms to describe something to others😂

  • @phyberoptyk5619
    @phyberoptyk5619 2 года назад +20

    You sir never cease to blow my mind with your incredible insight. Thank you!

  • @user-tk2jy8xr8b
    @user-tk2jy8xr8b Год назад +2

    The terms may be actually coined from math, there are covariant and contravariant functors in category theory and they very nicely demonstrate whan happens in C#. A covariant functor f (or just "functor") has a mapping `(a ~> b) -> (f a ~> f b)`, a contravariant functor g has a mapping `(a ~> b) -> (g b ~> g a)`. Now, imagine that ~> stands for "is subtype of", `f` and `g` are your types with variance definition on their type parameters, and you get variance relations in OOP: from `A : B` follows `F : F` if `F`, from `A : B` follows `F : F` if `F`. Now, about those `in` and `out`: functions are functors, covariant in their output and contravariant in their input.

  • @piotrrybka318
    @piotrrybka318 5 месяцев назад +2

    Very good explanation, but not because of the examples, but for the initial introduction of the cause-effect origins of both terms. I think this is the actual eye-opener which explains the essence of both concepts.
    I would only emphasize as strongly as I can that co- and contravariance are both very general concepts, and it's not about C# interfaces, in/out keywords, parameters and return values. The examples you gave may have been switched or given in another language, but the general idea is the following:
    If our new type N that we are building (the interface in your example), follows the order of derivation strictly, then it's COvariant, otherwise, it's CONTRAviariant.
    To put it more clearly:
    if there is type B derived from A, so B:A
    and I have a generic type N, then
    if
    for N I can get (in whatever way) only A
    in other words for shrinking⬇ of N, the output is also shrunk⬇
    and
    for N I can get both A and B
    in other words, for expanding⬆ of N, the output is also expanded⬆
    then N is COvariant
    if
    for N I can get both A and B
    in other words for shrinking⬇ of N, the output is expanded⬆
    and
    for N I can get only B
    in other words for expanding⬆ of N, the output is shrunk⬇
    then N is CONTRAvariant.
    But of course, it's still nice to see an implementation, which although not fully developed (you're assigning null! to your interfaces and try to use them), could easily be used in a compilable code.

  • @davidpccode
    @davidpccode 9 месяцев назад +2

    This explanation is not only perfect, it is a work of art.. Thanks!

  • @HugoGomezA
    @HugoGomezA 16 дней назад +1

    Truly, I am very grateful for your videos. You explain everything magnificently and in a way that's easy to understand."

  • @gorotim2000
    @gorotim2000 Год назад +4

    Деда, ты лучший. Я понял разницу между этими принципами, благодаря тебе.

  • @dracuul78
    @dracuul78 Год назад +12

    Thanks! This has to be the best explanation of the topic I've come across, with a nice exhaustive set of examples.

    • @zoran-horvat
      @zoran-horvat  Год назад +1

      Thank you! I am glad to hear it was helpful.

  • @dererzherzog
    @dererzherzog Год назад +4

    A great and very systematic explanation of the concepts of Covariance and Contravariance and their practical implications in various contexts (reference assignment, method parameters and interfaces).

  •  2 месяца назад

    What advantage gives using "MyInt" versus "MyInt" not specifying anything? Because if it doesn't change the behavior then it can be just ommited always, right?

  • @learner8084
    @learner8084 2 года назад +3

    Zoran sounds like a very intelligent person. Thanks for the video. Never x my mind to look at Base and Derived this way !

  • @Rhysling2
    @Rhysling2 6 месяцев назад +1

    Excellent explanation. I’ve heard several and this is the best. I may actually understand cov/ contra now.

  • @muhammedalikhan7559
    @muhammedalikhan7559 8 месяцев назад +1

    Amazingly simple explanation. Thank you so much for this!

  • @nightwheel_c
    @nightwheel_c 4 месяца назад +1

    Thank you! very clear, and I love your talking speed, it makes me easy to follow

  • @alecmatias4774
    @alecmatias4774 Год назад +2

    Thanks! This explains it better than other tutorials.

  • @mumk
    @mumk 2 года назад +2

    you made it so so so so so clear on this topic, thank you sir!

  • @imaginative-monkey
    @imaginative-monkey 7 месяцев назад +1

    Yeah, it was so easy, but for some reason, it was the first time I could understand it! 😆 👍

  • @aj.arunkumar
    @aj.arunkumar 9 месяцев назад +1

    explained perfectly.. i m checking out your course in pluralsight

  • @BeatusCanis
    @BeatusCanis Год назад +3

    Thank you for the good course. However, I would suggest insisting on what the in/out keywords do and how that ties into object substitution.
    I had to go to another source to fill in the details of co/contra-variance.

    • @zoran-horvat
      @zoran-horvat  Год назад

      Thanks for the suggestion. That makes sense.

  • @Darebit2k1
    @Darebit2k1 2 года назад +2

    ¡Gracias por compartir!, los ejemplos estuvieron muy claros y despejan toda duda acerca de estos dos conceptos

  • @ДмитрийКондратенко-б5ь

    Very clear explanation of this difficult concept!

  • @brenodev
    @brenodev 8 месяцев назад +1

    Best explanation ever. You're the man! Thanks Zoran :)

  • @somayehsheikhi7839
    @somayehsheikhi7839 Год назад +1

    Wow Thanks a lot Zoran, Finally I could understand these concepts. you are amazing .

  • @purplebytessolutions6994
    @purplebytessolutions6994 10 месяцев назад +1

    Beautifully explained!

  • @andreapulvirenti
    @andreapulvirenti Год назад +1

    Super clear video! thanks!!

  • @banster85
    @banster85 Год назад +1

    Great and very clear explanation, thanks!

  • @kaizer-777
    @kaizer-777 11 месяцев назад

    One thing that might not be immediately obvious is that you can't nest the generic types and get the same behavior since T includes the fully nested type. So if you had a List you couldn't assign a List to it.

    • @zoran-horvat
      @zoran-horvat  11 месяцев назад +1

      That is because List is invariant. Try with IEnumerable.

  • @NoDoubt747
    @NoDoubt747 Год назад +1

    Great job! That was the best demo on this topic I've found!

  • @Muhammadsaleh77
    @Muhammadsaleh77 13 дней назад +1

    I really enjoy your videos

  • @bitmanagent67
    @bitmanagent67 Год назад +1

    My brain just froze. Rebooting.

  • @montrazvan89
    @montrazvan89 Год назад +1

    Thank you guy from Budapest!
    Szio!

  • @muradshirinov4090
    @muradshirinov4090 2 года назад +1

    Very good explanation , thank you

  • @awazin4031
    @awazin4031 Год назад +1

    Wow ! Amazing teacher !

  • @anywheredoor4699
    @anywheredoor4699 Год назад

    Is there something on a thorough understanding of the TPL and also the difference of concurrency and parallel processing

  • @winzyl9546
    @winzyl9546 Год назад

    I understood Liskov Substitution principle, but I didn't understand what in or out does and how it relates to co or contravariance.

  • @ozziew007
    @ozziew007 Год назад +1

    Eureka moment. The concept is actually not that hard to understand when someone actually explains it well

  • @TrungTran-rz6tz
    @TrungTran-rz6tz Год назад +2

    I have this analogy, hope it helps somebody to grasp the concept easier
    Imagine you're a producer, if your product's quality improves you can satisfy more customers, more quality = more customers, so you are *covariant
    Imagine you're a consumer, if your expectation in product quality goes up there'll be fewer products that can satisfy you, more expectation = less options, so you are *contravariant

  • @imaginative-monkey
    @imaginative-monkey 7 месяцев назад

    One big question is: if for producer methods, the correct behavior is "Covariance" and for the consumer methods, the correct behavior is "Contravariance", why is it the developers' responsibility to set it?! I would like to know the applications. In other words, whenever I'm defining a generic type, should I go through the decision-making process of variance options? I've hardly encountered a code base that had specified this. Does it mean it's majorly used internally in .NET code base? Thanks! 👍

    • @zoran-horvat
      @zoran-horvat  7 месяцев назад +1

      Variance tells the compiler how to verify assignments. It appears that definite checks were not possible to automate, and so the language designers left it to the programmer to specify. I am not aware of any strongly typed language that is doing that automatically (though, I would love to learn if one exists!). That would be an interesting achievement.

    • @imaginative-monkey
      @imaginative-monkey 7 месяцев назад +1

      @@zoran-horvat Thanks for the reply. I hope some analyzers could provide suggestions like "You're just using T to return objects, would you like to mark T as covariance?"...

  • @almajdzino2365
    @almajdzino2365 Год назад +1

    Very clear tysm!

  • @YOUTUBE_IS_WOKE
    @YOUTUBE_IS_WOKE 2 года назад

    I got lost...😰

    • @zoran-horvat
      @zoran-horvat  2 года назад +4

      Watch again after a few weeks pause, and don't forget to write that code in the IDE as you progress. That will finally teach you and, once variance gets into your mind, I'm sure you will never watch the assignments the same way again.

  • @mackosajt86
    @mackosajt86 3 месяца назад

    are you hungarian?

  • @Marfig
    @Marfig 2 года назад +1

    I'm sorry, but you don't explain the need for the in and out keywords, as all your syntax checking remains the same when you take them out from the interface declarations. It's only at 9:10 in your video that the real importance of the keywords is revealed. But you never explain it, nor its practical implications. You only make statements in your video, you don't explain anything.

    • @zoran-horvat
      @zoran-horvat  2 года назад +2

      Excuse me, I must object to that. What was I doing for ten minutes if not explaining? But anyway, I have watched the video for you, and pulled out the important parts, so that you can focus on separate explanations as per need.
      04:00 - 05:00 Announces variance as augmenting the object substitution principle
      05:00 - 05:40 Explanation of out and in keywords, when they are used and what do we call that
      05:40 - 07:40 Practical implications of the out keyword, applying the OSP to output values
      07:40 - 09:05 Practical implications of the in keyword, applying the OSP to input values
      09:10 - 11:05 Practical implication of OSP when applied to variant interfaces

    • @Marfig
      @Marfig 2 года назад +3

      @@zoran-horvat I'm sorry. We'll just have to disagree on this. It's not my intention to deride you. But I felt that nowhere in the video you explain the need for those keywords. You state the syntax and grammar of the language very well. But come short on the semantics. As an example, You didn't remove the in and out keywords from the interfaces and explained the compiler syntax check changes that causes and why. This would have been the aha! moment for someone like me, who was trying to understand the concepts. I saw your video first yesterday. And remained confused as to why I needed those keywords. It was only after experimentation and seeing another video from someone else that I finally understand the concept and its applicability. Sorry.

  • @alexeybeloushko7240
    @alexeybeloushko7240 8 месяцев назад

    Covariance and Contravariance names comes from simple logical diagram of implicid assignment direction rules
    Contravariance
    PClass Generic
    Covariance
    PClass

    • @zoran-horvat
      @zoran-horvat  8 месяцев назад

      You are right about the analysis, but the use of names in science for the same effects is predating their use in programming by decades.