W porządku, od jakiegoś czasu próbuję znaleźć jakiekolwiek informacje na ten temat. Zbudowałem małą klasę, aby zobaczyć, jak trudne są certyfikaty typu "hard-safe-enums" dla ciągów znaków, ponieważ chcę używać ich do nazw pól w bazie danych i takich. Nigdy nie podobało mi się, że wyliczenia mogą być używane tylko w liczbach całkowitych.
Mimo że zaimplementowałem w tej klasie implicit operator
, za każdym razem, gdy spróbuję go użyć, otrzymuję wyjątek dotyczący nieprawidłowego rzutu. Brakuje mi tego, ponieważ w tym momencie nie widzę nic złego w moim kodzie.
Oto klasa:
C#: Niestandardowy niejawny operator rzutowania nie działa
/// <summary>
/// SBool - type-safe-enum for boolean strings
/// </summary>
public sealed class SBool
{
private readonly String name;
private readonly int value;
// these guys were for conversions. They might work better in another case,
// but for this one, they weren't very helpful.
// ((I.e. they didn't work either.))
//private static readonly Dictionary<SBool, String> stringsByBool = new Dictionary<SBool, String>();
//private static readonly Dictionary<String, SBool> boolsByString = new Dictionary<String, SBool>();
public static readonly SBool True = new SBool(1, "true");
public static readonly SBool False = new SBool(0, "false");
private SBool(int value, String name)
{
this.name = name;
this.value = value;
//stringsByBool[this] = name;
//boolsByString[name] = this;
}
private SBool(SBool sbool)
{
this.name = sbool.name;
this.value = sbool.value;
//stringsByBool[this] = name;
//boolsByString[name] = this;
}
public override String ToString()
{
return name;
}
/// <summary>
/// allows implicit casting of SBools to strings
/// </summary>
/// <param name="sbool">the SBool to cast into a string</param>
/// <returns>the string equivalent of the SBool (its value)</returns>
public static implicit operator String(SBool sbool)
{
if (sbool == SBool.True)
return SBool.True.name;
else
return SBool.False.name;
}
/// <summary>
/// implicitly cast a string into a SBool.
/// </summary>
/// <param name="str">the string to attempt to cast as a SBool</param>
/// <returns>the SBool equivalent of the string,
/// SBool.False if not either "true" or "false".</returns>
public static explicit operator SBool(String str)
{
if (!String.IsNullOrEmpty(str) && str.ToLower() == "true")
return SBool.True;
else
return SBool.False;
}
public static bool operator ==(SBool left, SBool right)
{
return left.value == right.value;
}
public static bool operator !=(SBool left, SBool right)
{
return left.value != right.value;
}
}
ta zawodzi na czeku zmiennej sesji:
if(((string)Session["variable"]) == SBool.False)
z InvalidCastException,
a ja szczerze mówiąc nie mam pojęcia dlaczego.
Z góry dziękuję; pliki cookie dla każdego, kto może wyjaśnić, dlaczego to nie działa (pliki cookie nie są dostępne we wszystkich obszarach). Zamierzam naprawić inne rzeczy, ale daj mi znać, jeśli coś jest niejasne. Aby uzyskać więcej informacji na temat wyrażeń typu "Bezpieczny typ", oto one of the SO posts Oparłem tę klasę z.
[MetaEDIT] lekceważ to. Byłem strasznie, okropnie błędnie. [/ edit]
Czy próbowałeś odlewania 'Session [„zmienna”]' na 'SBool' zamiast ciąg? Lub do 'string', a następnie' SBool'? –
'sBool.False' jest wartością logiczną poprawną ...? jeśli sprawdzasz, czy jest równy, dlaczego nie rzucić tej wartości po prawej stronie '==' na 'if (((ciąg znaków) Session [" zmienna "]) == SBool.False.ToString()' ' Casting błąd jest poprawne btw' – MethodMan
najprawdopodobniej wyjątkiem jest o tej obsadzie '(string) Session [„zmienna”]' – Lanorkin