Junior
Jakie rodzaje konwersji typów istnieją w C#?
sobes.tech AI
Odpowiedź od AI
W C# istnieją dwa główne rodzaje rzutowania typów: jawne i niejawne.
Rzutowanie niejawne (Implicit)
Występuje automatycznie, gdy kompilator jest pewien, że konwersja jest bezpieczna i nie spowoduje utraty danych. Na przykład z typu o mniejszym zakresie do typu o większym zakresie.
// Niejawne rzutowanie int na long
int i = 100;
long l = i;
Rzutowanie jawne (Explicit)
Wymaga wskazania w kodzie operatora rzutowania ((typ)) i jest używane, gdy konwersja może prowadzić do utraty danych lub wywołać wyjątek. Jest konieczne przy konwersji z typu o większym zakresie na typ o mniejszym lub między niepowiązanymi typami.
// Jawne rzutowanie double na int
double d = 123.45;
int i = (int)d; // Ułamek jest odrzucany
// Jawne rzutowanie obiektu na string
object obj = "Hello";
string s = (string)obj;
// Użycie operatorów as i is
object objAs = "World";
string sAs = objAs as string; // Zwraca null, jeśli konwersja jest niemożliwa
if (objAs is string) // Sprawdza, czy obiekt jest typu string
{
string sIs = (string)objAs;
}
Porównanie rzutowania jawnego, as i is
| Operacja | Opis | Błąd w przypadku niepowodzenia |
|---|---|---|
(Typ) wyrażenie |
Rzutowanie jawne. Wymaga dokładnego dopasowania typu. | InvalidCastException |
wyrażenie as Typ |
Próba konwersji typu. Działa tylko dla typów referencyjnych i typów, które pozwalają null. | Zwraca null |
wyrażenie is Typ |
Sprawdza, czy wyrażenie można przekonwertować na podany typ. | Wartość boolowska (true/false) |
Niestandardowe konwersje
Programista może zdefiniować własne operatory konwersji jawnej i niejawnej dla własnych typów, używając słów kluczowych implicit i explicit.
// Przykład niestandardowej konwersji niejawnej
public class Inches
{
public int Value { get; set; }
public static implicit operator Millimeters(Inches i)
{
return new Millimeters { Value = i.Value * 25 };
}
}
public class Millimeters
{
public int Value { get; set; }
}
// Użycie
Inches inches = new Inches { Value = 10 };
Millimeters mm = inches; // Konwersja niejawna
// Przykład niestandardowej konwersji jawnej
public class Kilograms
{
public int Value { get; set; }
}
public class Pounds
{
public int Value { get; set; }
public static explicit operator Kilograms(Pounds p)
{
return new Kilograms { Value = (int)(p.Value / 2.20462) };
}
}
// Użycie
Pounds pounds = new Pounds { Value = 100 };
Kilograms kg = (Kilograms)pounds; // Konwersja jawna