لا يمكن أن يحول ضمنا نوع "X" إلى "السلسلة" - متى وكيف تقرر أنه "لا يمكن"؟

StackOverflow https://stackoverflow.com/questions/751303

  •  09-09-2019
  •  | 
  •  

سؤال

الآن أنا أواجه Guidس.

بالتأكيد أتذكر أنه في جميع أنحاء التعليمات البرمجية في بعض الأماكن التي يعمل فيها هذه الأعمال الضمنية، في الآخرين لا. حتى الآن أفشل في رؤية النمط.

كيف يقرر التحويل البرمجي متى لا يستطيع؟ أعني، طريقة النوع Guid.ToString() موجود، أليس كذلك كلما حاجة إلى هذا التحول؟

هل يمكن لشخص ما أخبرني بموجب الظروف التي يتم بها هذا التحول تلقائيا وعندما يتعين علي الاتصال myInstance.ToString() صراحة؟

هل كانت مفيدة؟

المحلول

باختصار، عندما يكون هناك مشغل تحويل ضمني أو صريح محدد:

class WithImplicit {
    public static implicit operator string(WithImplicit x) {
        return x.ToString();}
}
class WithExplicit {
    public static explicit operator string(WithExplicit x) {
        return x.ToString(); }
}
class WithNone { }

class Program {
    static void Main() {
        var imp = new WithImplicit();
        var exp = new WithExplicit();
        var none = new WithNone();
        string s1 = imp;
        string s2 = (string)exp;
        string s3 = none.ToString();
    } 
}

نصائح أخرى

لا، لا يوجد تحويل ضمني من GUID ل String, ، لذلك لا يعمل في أي مكان على الإطلاق في التعليمات البرمجية.

يعمل فقط حيث يوجد تحويل صريح، ولكن قد لا يكون التحويل مرئيا للغاية. على سبيل المثال عندما تقوم بسلسلة السلاسل:

string id = "--" + guidValue + " : " + num;

قد يبدو هذا التحويل الضمني من GUID ل String, ، لكنه ليس كذلك. يبدو الكود الذي تم إنشاؤه بالفعل مثل هذا:

string id = String.Concat(new object[] { "--", guidValue, " : ", num });

جميع المعاملات يلقيون من النوع Object ووضعها في صفيف. ال String.Concat الطريقة ثم تستدعي ToString طريقة لكل عنصر في الصفيف للحصول على تمثيل السلسلة لهم.

المكان الوحيد الذي لا تحتاج فيه بفعالية لا تحتاج إلى استدعاء ToString () بنفسك هو عند التزامن السلاسل.

Guid g;
int i;
string s = "Hello "+g+' '+i;

ثم هناك بعض المواقف التي يتم فيها إجراء المكالمة بواسطة .NET Framework، مثل string.format ().

بخلاف ذلك، سيؤدي المحول البرمجي فقط إلى تحويل نوع إذا كان معروفا أنه متوافق (مثل الفئة الأساسية أو تنفيذ واجهة أو عبر عامل تحويل مشفرة صراحة). عند استخدام المصبوب، يعرف المحول البرمجي أن الأنواع لا يمكن أن تكون متوافقة (على سبيل المثال لا في نفس خط الوراثة، وليس واجهات)، سيقول أيضا أنه لا يمكن تحويله. الشيء نفسه ينطبق على معلمات نوع عام.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top