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.
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é
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.
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.
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é
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é