Интерфейсы со структурами по ссылке с использованием Generics

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

Вопрос

Извините ребята!я так увлечен кодом!что я забыл указать ошибки компилятора.

Вот новая версия упрощенного кода!

А это ошибки:

Ошибка 1. Лучшее совпадение перегруженного метода для «IWeird.DataBase.ModifyData(ref IWeird.IDataTable)» имеет несколько недопустимых аргументов.
Ошибка 2. Аргумент «1»:невозможно преобразовать «ref IWeird.Periods» в «ref IWeird.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