سؤال

آسف شباب! أنا في الكود! أن نسيت وضع أخطاء المحول البرمجي.

هنا نسخة جديدة من التعليمات البرمجية المبسطة!

وهذه هي الأخطاء:

خطأ 1 أفضل طريقة تطابق طريقة مثالية ل 'iwird.database.modifydata (المرجع iwird.idatatable)' لديه بعض الوسائط غير صالحة
خطأ 2 وسيطة '1': لا يمكن تحويلها من "المرجع iwird.periods" إلى "ref iwird.idatatable"

المشكلة: لا أستطيع المرور بالرجوع إلى واجهة مع بنية فيها، ماذا أفعل الخطأ؟

هنا هو رمز المثال الجديد:

class PeriodsProcessor
    {
        public PeriodsProcessor()
        {
            Periods Data = new Periods();
            DataBase DB = new DataBase();

            Console.WriteLine(Data.Value);
            DB.ModifyData(ref Data);
            Console.WriteLine(Data.Value);

            Console.ReadLine();
        }
    }


    public interface IDataTable
    {
        string Value { get; set; }
    }

    public struct Periods : IDataTable
    {
        public string Value { get; set; }
    }

    public class DataBase
    {
        public void ModifyData(ref IDataTable data) 
        {
            data.Value = "CHANGE";
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            PeriodsProcessor PeriodsProcessor = new PeriodsProcessor();
        }
    }
هل كانت مفيدة؟

المحلول

المشكلة في DB.ModifyData<Period>(Data); طريقة الاتصال. لك Data الحقل هو بنية، يتم تمرير الهياكل إلى أي طرق بالقيمة مما يعني أنه في كل مرة تسمون طريقة ينسخ يتم إنشاء بنية ويتم تمريرها إلى الطريقة. لذلك في الواقع الخاص بك ModifyData الطريقة هي تعديل نسخة من Periods هيكل يتم إلقاؤه بعيدا بعد دعوة الطريقة.

نصائح أخرى

في التعليمات البرمجية، لا تقوم بتمرير واجهة مع بنية فيه، فأنت تمر بتهوية تنفذ واجهة. تلك هي شيئان مختلفان تماما. أما بالنسبة لحل مشكلتك، لا أرى سبب لاستخدام بنية على الإطلاق، لذلك سأغير الفترات ليكون فئة.

بنيات هي أنواع القيمة، وليس أنواع المرجعية. إذا كنت ترغب في تمريرها بالرجوع إليها، فسيتعين عليك استخدام ref الكلمة الرئيسية. ضع في اعتبارك أنه لا يزال لا يزال نوعا قيمة، وتعيينه لمتغير آخر سوف يخلق بنية جديدة.

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