Hej, jag må vara förvirrad men en sak förstår jag inte och det är varför jag måste casta om något som redan är integer? Kan någon ge mig ljus över detta? Det är inte precis en förklaring till varför man har gjort så, men det är dokumenterat hos Microsoft: Därför att enumerationer ärver från Enum, inte från int. En explcit cast triggar då Explicit cast operatorn och gör det väldigt tydligt i din kod vad det är för något. Förresten, varför sparar du kunder i en enum? Det låter inte helt flexibelt. I det här fallet var det ett exempel rörande 2 konstanter.. Jo, currentcustomer är av typen customer som är en funktion av typen int men det syns inte i exemplet. Det är castningen som jag ifrågasatte och funderade på och tycker det är "overhead" .. >Jo, currentcustomer är av typen customer som är en funktion av typen int men det syns inte i exemplet. Det är ju ganska intressant problem och här trodde jag hela tiden att enum var en struct inte en klass, eller hur var det nu roggan? ;) allting heter .class i MSIL http://weblogs.asp.net/kennykerr/archive/2004/09/09/introduction-to-msil-part-3-defining-types.aspx Jo jag är medveten om det, men det är inte samma sak som att det "är en klass i .net". Det är en "klass i IL" kanske men inte i .NET. *host* det var pseudo c# kod ;-)*/host*enum och typecast
public enum Customers : int
{
Expressen = 1,
Aftonbladet = 2
}
För att sedan kunna använda detta så måste jag skriva:
if (CurrentCustomer == (int)Customers.Expressen)
{
panelExpressenSelection.Visible = true;
lstObject.Items[12].Enabled = false;
}
Att göra denna cast verkar ju överknäppt - eller
Sv: enum och typecast
<info>The underlying type specifies how much storage is allocated for each enumerator. However, an explicit cast is needed to convert from enum type to an integral type.</info>
http://msdn2.microsoft.com/en-us/library/sbbt4032(VS.80).aspx
Den angivna typen (int) skall nog inte ses som en basklass utan bara som en specifikation av lagringstyp. Därför blir inte Customers en subklass till int, och alltså är Expressen inte ett int, även om det lagras som ett int.Sv:enum och typecast
Dessutom behöver inte alla enums vara int, de kan vara short eller long också. Vilket gör det ännu viktigare att man är tydlig.Sv: enum och typecast
Sv: enum och typecast
if (CurrentCustomer == (int)Customers.Expressen)
>Att göra denna cast verkar ju överknäppt - eller
Varför är inte CurrentCustomer av typen Customer?
Sv:enum och typecast
Sv: enum och typecast
Det jag menar är att om currentcustomer är av (enum-)typen Customers så behöver du ingen cast.
>Det är castningen som jag ifrågasatte och funderade på och tycker det är "overhead" ..
Jo men casting behövs ju alltid när man skall jämföra två olika typer. I många fall är den implicit (t.ex. int, double) men i andra fall är det explicit. Poängen med att kräva explicit cast är ju att det skall synas i koden att man vet vad man gör.
(Sen kan man ju diskutera om inte alla casts egentligen borde vara explicita förutom derived->base)
I C är konverteringen mellan enum och int implicit men de flesta är överrens om att det inte är bra så i nästa c++ standard har man ändrat så det fungerar som i C#.
>if (CurrentCustomer == (int)Customers.Expressen)
Den här raden är bara så fel. Antingen ser du till att CurrentCustomer är av enumtyp eller också använder du konstanter istället:
public static class Customers {
public const int Expressen = 1;
public const int Aftonbladet = 2;
};
Sv: enum och typecast
men iaf.
En enum är en klass i .net
tex din enum blir i kompilerad form:
.class public auto ansi sealed Customer
extends [mscorlib]System.Enum
{
.field public static literal valuetype ConsoleApplication18.Customer Expressen = int32(1)
.field public static literal valuetype ConsoleApplication18.Customer Aftonbladet = int32(2)
.field public specialname rtspecialname int32 value__
}
dvs en klass som innehåller två konstanter (ok inte äkta konstanter men iaf)
och ett publikt instansfält av samma typ som värdena i din enum, i det här fallet en int32
överstatt från IL till c# så blir det:
public sealed class Customer : enum
{
public static readonly int Expressen = 1;
public static readonly int Aftonbladet = 2;
public int value__;
}
När man ser detta så blir det ju inte så konstigt längre
du jämför alltså en int32 med en instans av din Customer klass.Sv:enum och typecast
Sv: enum och typecast
Sv:enum och typecast
Sv: enum och typecast
men självklart :) , eftersom enum ärver valuetype så är det struct i c#
mitt kodexempel ger ju kompileringsfel , men det skulle ju även ge kompileringsfel om du skrv struct eftersom enum inte går att ärva själv (i c#)..
så det var mer för att visa vad för kod som skapas av enums.
Aktare så jag inte kommer o ställer taskiga frågor på devsummit ;-)