Miałem wrażenie, że wszystkie typy wartości dziedziczą po System.ValueType i ponieważ wiem, że Dziesiętny to struktura, która jest również typem wartości, co oznacza, że Decimal musi być typem wartości. Dlaczego więc resharper pokazuje hierarchię typów jako taką:
Czy coś tutaj nie rozumiem?
3 odpowiedzi
Jeśli pokażę (w ReSharper 5.1) Dziesiętny w innym trybie widoku (Hierarchia supertypów), widzę, że:
Więc wszystko jest tak, jak można się spodziewać.
Decimal nie pochodzi z IFormattable, po prostu implementuje interfejs IFormattable.
Implementacja interfejsu jest czasami nazywana „dziedziczeniem” i wygląda prawie tak samo.
Jestem bardziej zaskoczony, że resharper nie pokazuje reszty interfejsów.
Przejdź do definicji (F12) w VS pokazuje:
public struct Decimal :
IFormattable, IComparable, IConvertible, IDeserializationCallback,
IComparable<decimal>, IEquatable<decimal>
Nie ma typu, który faktycznie dziedziczy po System.ValueType
w tradycyjnym sensie dziedziczenia, jak to wyrażono w kodzie (jest System.Enum
, ale na potrzeby tej dyskusji nie materiał). ValueType
to specjalny typ, który nie jest przeznaczony do użycia w kodzie; „dziedziczysz” po nim, deklarując, że typem jest struct
:
Chociaż
ValueType
jest niejawną klasą bazową dla typów wartości, ty nie może utworzyć klasy, która dziedziczy bezpośrednio zValueType
. W zamian, poszczególne kompilatory dostarczają słowa kluczowego języka lub konstrukcji (takiej jakstruct
w C# iStructure…End Structure
w Visual Basic) do obsługi tworzenie typów wartości.
Ten typ „dziedziczenia” jest obsługiwany przez kompilator, który ma wiedzę na temat tych „specjalnych” typów (na przykład istnieje również System.Void
).
Pokazana hierarchia dziedziczenia odpowiada tradycyjnej koncepcji dziedziczenia, więc nie odzwierciedla relacji między ValueType
a Decimal
(lub jakimkolwiek innym struct
).
Podobne pytania
Nowe pytania
c#
C # (wymawiane „patrz ostro”) jest językiem programowania wysokiego poziomu, statycznie typowanym, wieloparadygmatowym opracowanym przez firmę Microsoft. Kod C # zwykle jest przeznaczony dla rodziny narzędzi Microsoft .NET i czasów wykonywania, do których należą między innymi .NET Framework, .NET Core i Xamarin. Użyj tego tagu w przypadku pytań dotyczących kodu napisanego w C # lub C # formalnej specyfikacji.