Sobes.tech
Junior

Какви видове преобразувания на типове съществуват в C#?

sobes.tech AI

Отговор от AI

В C# има два основни вида преобразуване на типове:

  1. Явно преобразуване (Explicit conversion): Изисква използването на оператора (тип). Използва се, когато компилаторът не може безопасно автоматично да извърши преобразуването, например при преобразуване от базов клас към производен или от тип с по-голяма точност към тип с по-малка (например, double към int). Това може да доведе до загуба на данни или грешки по време на изпълнение (InvalidCastException).

    // Явно преобразуване от double към int
    double d = 123.45;
    int i = (int)d; // i ще бъде равно на 123
    
    // Преобразуване на обект към конкретен тип
    object obj = "Hello";
    string s = (string)obj; // s ще бъде "Hello"
    
  2. Косвено преобразуване (Implicit conversion): Извършва се автоматично от компилатора, когато преобразуването е известно и безопасно, тоест без загуба на данни. Например, преобразуване от int към double.

    // Косвено преобразуване от int към double
    int x = 10;
    double y = x; // y ще бъде 10.0
    
    // Косвено преобразуване от производен клас към базов
    class Base {}
    class Derived : Base {}
    
    Derived derivedObj = new Derived();
    Base baseObj = derivedObj; // Косвено преобразуване
    

Освен това съществуват операторите as и is, които също се отнасят към преобразуването на типове, но с особености:

  • Оператор as: Извършва преобразуване на тип, ако е възможно, и връща null, ако не е успяло. Не генерира изключение InvalidCastException. Използва се само с референтни типове и Nullable типове.

    // Използване на оператора `as`
    object obj2 = "World";
    string s2 = obj2 as string; // s2 ще бъде "World"
    
    object obj3 = 123;
    string s3 = obj3 as string; // s3 ще бъде null
    
  • Оператор is: Проверява дали обект е инстанция на определен тип или от него произхождащ тип. Връща true или false. В последните версии на C# може да се използва с pattern matching, което позволява едновременно проверка и преобразуване.

    // Използване на оператора `is` за проверка на тип
    object obj4 = "Example";
    if (obj4 is string)
    {
        // Действия, ако обектът е низ
    }
    
    // Използване на `is` с pattern matching
    if (obj4 is string str)
    {
        // str е наличен тук като низ
    }