Frage

Sorry, Jungs! Ich bin so in den Code! dass ich vergessen, die Compiler-Fehler zu setzen.

Hier ist eine neue Version des Codes vereinfacht!

Und dies sind die Fehler:

Fehler 1 Das beste überladene Methode Match für 'IWeird.DataBase.ModifyData (ref IWeird.IDataTable)' hat einige ungültige Argumente
Fehler 2 Argument '1': Konvertierung von 'ref IWeird.Periods' auf 'ref IWeird.IDataTable'

Das Problem: Ich kann nicht mit Hilfe einer Schnittstelle mit einer Struktur in es passieren, was mache ich falsch?

Hier ist der neue Beispielcode:

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();
        }
    }
War es hilfreich?

Lösung

Das Problem ist in DB.ModifyData<Period>(Data); Methodenaufruf. Ihr Data Feld ist eine Struktur, Strukturen weitergegeben werden alle Verfahren nach Wert , das bedeutet, dass jedes Mal, wenn Sie eine Methode aufrufen Kopieren der Struktur erstellt und an die Methode übergeben . Also eigentlich Ihre ModifyData Methode eine Kopie der Periods Struktur ändern, die weggeworfen wird nur nach dem Methodenaufruf.

Andere Tipps

In Ihrem Code Sie eine Schnittstelle mit einer Struktur in nicht vorbei, Sie übergeben eine Struktur, dass eine Schnittstelle implementiert. Das sind zwei völlig verschiedene Dinge. Wie für Ihre Problemlösung, sehe ich keinen Grund überhaupt eine Struktur verwenden werden, so dass ich Zeiten ändern würde eine Klasse sein.

Structs sind Werttypen nicht Referenztypen. Wenn Sie es unter Bezugnahme auf geben wollen, Sie gehen zu haben, die ref Schlüsselwort zu verwenden. Beachten Sie aber, dass es immer noch ein Werttyp ist, und an einer anderen Variablen zugewiesen wird eine neue Struktur zu schaffen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top