C# adnotacja wariancji parametru type, ograniczona do typu value

W C# możliwe jest dodanie adnotacji wariancji do parametru type, ograniczonego do typu value:

interface IFoo<in T> where T : struct
{
  void Boo(T x);
}

Dlaczego jest to dozwolone przez kompilator, jeśli adnotacja wariancji nie ma sensu w takiej sytuacji?

Author: Max Galkin, 2012-02-20

2 answers

Dlaczego jest to dozwolone przez kompilator, skoro adnotacja wariancji nie ma sensu w takiej sytuacji?

Jest to dozwolone przez kompilator, ponieważ nigdy nawet nie myślałem, że ktoś może próbować to zrobić, kiedy dodałem reguły wariancji do kompilatora C# 4.0.

Ostrzeżenia i błędy kompilatora sąfunkcjami , i aby funkcja mogła zostać zaimplementowana, musi być przynajmniej pomyślanaprzed wysłaniem kompilatora . I nie udało się tego zrobić, a zatem nigdy nie miał okazji nawet debatować, czy w takiej sytuacji powinno być Ostrzeżenie.

Teraz, kiedy zwróciłeś na to moją uwagę, pytanie brzmi: czy to powinna być funkcja? Czy kompilator powinien wygenerować ostrzeżenie (lub błąd) w tym przypadku?

To jest decyzja osądowa. Kilka rzeczy, które rozważymy to:
  • Czy ten kod to coś, co ktoś może wpisać myśląc, że robi coś sensownego? Jedna nadzieja nie; mamy nadzieję, że deweloper, który wie wystarczająco dużo o systemie typów, aby stworzyć wariant interfejsu, wie również, że wariancja działa tylko na typach referencyjnych. Ale może są programiści, którzy mogą to wpisać myśląc, że to zadziała. Przynajmniej nie wydaje się to nieprawdopodobne. Nie jest to wyraźnie wymyślone.

  • Czy kod wyraźnie się myli ? Pewnie tak. Wydaje się bardzo mało prawdopodobne, że ktoś celowo chce napisać interfejs, który wygląda wariant, ale w rzeczywistości nie jest.

I tak dalej.

Będę musiał to przemyśleć, ale na pierwszy rzut oka wygląda na to, że to może być przyzwoite ostrzeżenie, aby dodać je do kompilatora. Porozmawiam o tym z zespołem i rozważymy dodanie go do wersji Roslyn.

Dzięki za pomysł!

 36
Author: Eric Lippert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-20 01:47:07

Jest to dozwolone tylko dlatego, że jest to kodeks prawny. Nie ma w tym nic złego. Tak, nie można użyć konwersji kontrawariantnej, ale nie widzę problemu. Nic w kodzie nie wprowadzi w błąd ani nie ukryje jakiegoś pokręconego gotcha .

Po prostu myślę, że kompilator nie sprawdza, czy T jest typem wartości czy typem odniesienia podczas sprawdzania ważności wariancji. Wynika z tego, że zespół C# zakładał, że każdy, kto używa generycznego interfejsu wariancja wiedziałaby, że robienie tego z typami wartości jest bezcelowe i w każdym razie nie ma skutków ubocznych.

 2
Author: InBetween,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-19 22:27:19