Интерфейсы со структурами по ссылке с использованием Generics
-
19-09-2019 - |
Вопрос
Извините ребята!я так увлечен кодом!что я забыл указать ошибки компилятора.
Вот новая версия упрощенного кода!
А это ошибки:
Ошибка 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
ключевое слово.Однако имейте в виду, что это все еще тип значения, и присвоение его другой переменной приведет к созданию новой структуры.