در زبان سی شارپ به طور معمولی نمیتوانید کلاس ها را به یک متغییر از نوع int و یا هر نوع دیگری تبدیل و یا cast کنید و همچنین عملیات برعکس آن. به طور پیشفرض نمیتوانید یک عدد از نوع int را به یک یک کلاس انتساب دهید. اما با استفاده از implicit operator و explicit operator ها میتوانید این کار را انجام دهید. نحوه کار implicit operator به صورت زیر است که شما میخواهید یک تایپ را به کلاس خوت cast کنید. برای انجام این کار باید در کلاس مورد نظر خود یک implicit operator ایجاد کنید که مشخص کنید میتوانید یک تایپ بخصوص را به کلاس مورد نظر خود cast کنید.

public class Student
{
    public Student(string fullName)
    {
        FullName = fullName;
    }
    public string FullName { get; set; }
    public int Age { get; set; }

    public static implicit operator Student(string name)
    {
        return new Student(name);
    }
}

در کد بالا یک کلاس ایجاد کرده ایم به نام Student که شامل یک implicit operator برای نوع string می باشد. با انجام این کار میتوانیم یک متغییر از نوع string را به کلاس Student انتساب دهیم به صورت زیر:

class Program
{
    static void Main(string[] args)
    {
        Student student = "Farhad Zamani";
        Console.WriteLine(student.FullName);
    }
}

با اینکار زمانی که مقدار یک متغییر string را درون کلاس Student قرار میدهیم یک شی جدید از نوع Student ایجاد میشود که پراپرتی FullName آن برابر است با مقدار متغییر string که به آن داده ایم.

اما اگر بخواهیم عملیات برعکس این کار را انجام دهیم باید مجددا از implicit operator استفاده کنیم. یعنی باید یک implicit operator ایجاد کنیم که کلاس Student را  به تایپ string و یا هر تایپ دیگری که نیاز داریم تبدیل کند. برای انجام این کار باید به صورت زیر عمل کنیم :

public class Student
{
    public Student(string fullName)
    {
        FullName = fullName;
    }
    public Student(string fullName, int age) : this(fullName)
    {
        Age = age;
    }

    public string FullName { get; set; }
    public int Age { get; set; }

    public static implicit operator Student(string name)
    {
        return new Student(name);
    }

    public static implicit operator int(Student student)
    {
        return student.Age;
    }
}

با انجام این کار میتوانیم کلاس Student را به یک متغییر int انتساب دهیم و مقدار پراپرتی Age به متغییری که به آن انتساب داده شده است قرار میگیرد :

static void Main(string[] args)
{
    Student student = "Farhad Zamani";
    student.Age = 21;
    int age = student;
    Console.WriteLine(student.FullName + "\t" + age);
}

اما اگر بخواهیم که توسعه دهنده حتما باید عملیات cast را انجام دهد میتوانیم از explicit operator استفاده کنیم. تفاوت explicit و implicit در این است که در explicit حتما باید عملیات cast کردن را انجام دهیم در غیر این صورت کامپایلر خطای زیر را نشان میدهد:

Cannot implicitly convert type '' to ''. An explicit conversion exists (are you missing a cast?)

اگر بخواهیم از explicit استفاده کنیم برای انتساب کلاس Student به متغییر int باید به صورت زیر عمل کنیم :

public static explicit operator int(Student student)
{
    return student.Age;
}

عملیات cast :

static void Main(string[] args)
{
    Student student = "Farhad Zamani";
    student.Age = 21;
    int age = (int)student;//<--NOTE THIS
    Console.WriteLine(student.FullName + "\t" + age);
}

;)

Powered by Froala Editor

نظرات

سایر نظرات
  • عل نیکفر

    بسیار عالی و کامل

    ارسال شده در تاریخ سه شنبه، ۱۲ دی ۱۴۰۲
    • admin

      ممنونم

      ارسال شده در تاریخ شنبه، ۱۶ دی ۱۴۰۲
  • hassa kanani

    سلام عرض ادب اینطور میشه گفت در implicit خودش تایپی که میخواد بهشت map بشه میدونه ولی در explicit باید تایپ قبل cast بیادPersonDto personDto = new() { Age=3,FullName="fullName"};Person person = (Person)personDto;

    ارسال شده در تاریخ شنبه، ۱۸ فروردین ۱۴۰۳
  • admin

    بله دقیقا

    ارسال شده در تاریخ شنبه، ۱۸ فروردین ۱۴۰۳