Kowariancja, kontrawariancja a czy jest Iwariancja?

Odpowiedz Nowy wątek
Robinhuud
2016-08-30 16:57
Robinhuud
0

Witam, otóz ostatnio kłóciłem się ze znajomym, ze nie ma czegoś takiego jak iwariancja w c#, ze jest tylko kowariancja i kontrawariancja. Teraz pytanie do was czy on mial racje ? Jeżeli tak to na czym polega iwariancja ?

Pozostało 580 znaków

2016-08-30 17:29
Moderator

Rejestracja: 12 lat temu

Ostatnio: 6 godzin temu

Lokalizacja: Wrocław

0

A nie inwariancja czasem?


"HUMAN BEINGS MAKE LIFE SO INTERESTING. DO YOU KNOW, THAT IN A UNIVERSE SO FULL OF WONDERS, THEY HAVE MANAGED TO INVENT BOREDOM."

Pozostało 580 znaków

Robinhuud
2016-08-30 17:55
Robinhuud
0

Tak chodziło o inwariancje .

Pozostało 580 znaków

2016-08-30 23:21

Rejestracja: 15 lat temu

Ostatnio: 5 godzin temu

1

Prosty przykład:

using System;
using System.Collections.Generic;

public class Test
{
    class A {};

    class B: A {};

    public static void Main()
    {
        List<A> listA;
        List<B> listB;
        listA = listB;
    }
}

Kompilacja wysypuje się w miejscu przypisania. List są inwariantne, a więc wartość typu List<x> możesz przypisać do zmiennej typu List<y> wtedy i tylko wtedy, gdy X == Y.

Disclaimer:
Z C# orłem nie jestem i nie zależy mi na tym :P


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
edytowany 2x, ostatnio: Wibowit, 2016-08-30 23:22

Pozostało 580 znaków

2016-08-30 23:29
Moderator C# i .NET

Rejestracja: 7 lat temu

Ostatnio: 11 godzin temu

Lokalizacja: Polska, Kraków

2

Tak twój kolega miał rację jest w C# inwariancja (ang. invariance), czyli możesz użyć tylko takiego typu jaki został zdefiniowany, czyli inwariancja nie jest ani kowariancją ani kontrawariancją. Przykładem są typy wartościowe jak i w niektórych przypadkach tyczy się to również typów referencyjnych np.:

Klasa jest zawsze inwariancyjna:

// Error
public class Foo<in T>
{
}

// Error
public class Bar<out T>
{
}

inny przykład, kontrawariancja która działa:

public class Test
{
    public static void Hmm(Foo foo)
    {
    }

    public static void Main()
    {
        var bar = new Bar();
        // Contravariance Example
        Hmm(bar);
    }

    public class Bar : Foo
    {
    }

    public class Foo
    {
    }
}

ale jeśli parametr funkcji Hmm zostanie oznaczymy jako ref/out powyższy kod się nie skompiluje bo w tym przypadku możesz przekazać tylko obiekt takiego typu jaki został określony w metodzie:

public class Test
{
    public static void Hmm(ref Foo foo)
    {
    }

    public static void Main()
    {
        // var bar = new Bar();
        // Hmm(ref bar); // Error

        var foo = new Foo();
        Hmm(ref foo); // Ok
    }

    public class Bar : Foo
    {
    }

    public class Foo
    {
    }
}

Yubby dibby dibby dibby dibby dibby dibby dum..
edytowany 2x, ostatnio: DibbyDum, 2016-08-30 23:54

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0