Laden...

Warum enum-Elemente auf int casten?

Erstellt von pollito vor einem Jahr Letzter Beitrag vor einem Jahr 390 Views
pollito Themenstarter:in
314 Beiträge seit 2010
vor einem Jahr
Warum enum-Elemente auf int casten?

Hallo an alle,

ich habe wieder einmal ein Verständnisproblem – diesmal bei der Verwendung von enum. Wie Microsoft unter "Enumerationstypen: C#-Referenz" beschreibt, sind die einzelnen Werte, sofern man nichts anders angibt, standradmäßig int – in diesem Fall genau das, was ich brauche.

Nun füge ich nachstehend ein kurzes Testprogramm bei, welches meine Frage veranschaulicht.

  • Ich definiere ein enum RV mit vordefinierten int-Werten.
  • Im nachfolgendem Dictionary<int, string> RetVal nutze ich die enum-Werte als Key.

Frage:
Warum muss ich beim Konstruieren des Dictionary auf int casten, wenn die Werte per Definition sowieso von diesem Datentyp sind?


namespace enum_dic
{
	internal class Program
	{
		static void Main(string[] args)
		{
			foreach (var rv in Constants.RetVal)
			{
				Console.WriteLine($"{rv.Key,4}\t{rv.Value}");
			}

			Console.ReadLine();
		}
	}


	internal static class Constants
	{
		internal enum RV
		{
			Success						=    0,
			WrongParameterNumber		=   -1,
			OrderNotFound				=   -2,
			CannotWriteLogFile			=   -3,
			ErrorInCommandLine			=  -50,
			DataViewNotCreated			=  -60,
			NotDataFound				=  -61,
			MoreThanOneArticle			=  -70,
			ArticleNotFoundInPartList	=  -72,
			ErrorWhileQueryingDatabase2	=  -96,
			ErrorWhileQueryingDatabase	=  -97,
			WorkerMayBeStartedOnlyOnce	=  -98,
			WorkerCouldNotBeSetup		=  -99,
			UntreatedException			= -100
		}

		internal static readonly Dictionary<int, string> RetVal = new()
		{
			{ (int) RV.Success,                       "Erfolgreiche Ausführung" },
			{ (int) RV.WrongParameterNumber,          "Falsche Parameterzahl" },
			{ (int) RV.OrderNotFound,                 "Auftrag nicht auffindbar" },
			{ (int) RV.CannotWriteLogFile,            "Zugriff auf Logdatei nicht möglich" },
			{ (int) RV.ErrorInCommandLine,            "Fehler beim Prüfen der Kommandozeilenparameter" },
			{ (int) RV.DataViewNotCreated,            "Die DataView konnte nicht erstellt werden." },
			{ (int) RV.NotDataFound,                  "Daten konnten nicht gefunden werden." },
			{ (int) RV.MoreThanOneArticle,            "Mehr als ein E11- bzw. E33-Artikel in der Stückliste gefunden." },
			{ (int) RV.ArticleNotFoundInPartList,     "Der gesuchte Artikel wurde in der Stückliste nicht gefunden." },
			{ (int) RV.ErrorWhileQueryingDatabase2,   "Fehler beim Abfragen der Datenbank. Spalten bzw. Zeilen dürfen nicht Null sein." },
			{ (int) RV.ErrorWhileQueryingDatabase,    "Fehler beim Abfragen der Datenbank" },
			{ (int) RV.WorkerMayBeStartedOnlyOnce,    "Der Worker darf nur einmal gestartet werden." },
			{ (int) RV.WorkerCouldNotBeSetup,         "Der Worker konnte nicht eingerichtet werden." },
			{ (int) RV.UntreatedException,            "Unbehandelte Ausnahme" }
		};
	}
}

Danke und liebe Grüße

René

René

4.931 Beiträge seit 2008
vor einem Jahr

Weil ein Enumerationstyp ein eigener Datentyp ist, der nur als Wrapper für den darunterliegenden Datentyp fungiert.
Du solltest daher Dictionary<RV, string> benutzen, und dann benötigst du auch keinen Cast mehr.

T
2.219 Beiträge seit 2008
vor einem Jahr

Steht doch in der doku:
Enumerationstypen: C#-Referenz

Und im grunde liegt es auch auf der Hand bei einer stark typisierten Sprache wie C# wird ein Enum Wert auch als ein Enum Wert betrachtet.
Aber warum nimmst du nicht direkt die Enum Werte im dictionary als Key?
Dann kann kannst du das (Un-)Boxing aussparen.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

pollito Themenstarter:in
314 Beiträge seit 2010
vor einem Jahr

Ach so, der Wert entspricht zwar einem int, der Datentyp ist jedoch ein anderer (hier RV). Einleuchtend – da habe ich die MS-Hilfe zu wörtlich genommen bzw. missverstanden.

Vielen Dank für die rasante Hilfe!

Einen schönen Tag und bis zur nächsten Frage.

René

René

pollito Themenstarter:in
314 Beiträge seit 2010
vor einem Jahr

Und im grunde liegt es auch auf der Hand bei einer stark typisierten Sprache wie C# wird ein Enum Wert auch als ein Enum Wert betrachtet.
Aber warum nimmst du nicht direkt die Enum Werte im dictionary als Key?
Dann kann kannst du das (Un-)Boxing aussparen.

Danke, habe das bereits geändert. Ich habe mit Scheuklappen gelesen, was ich lesen wollte und ob der späten Stunde nicht weiter nachgedacht.

Nochmals vielen Dank!

René