对不起伙计们!我很喜欢这个代码!我忘了把编译错误。
这是一个简化代码的新版本!
这就是错误:
错误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();
}
}
答案 0 :(得分:2)
在您的代码中,您没有传递带有结构的接口,而是传递实现接口的结构。这是完全不同的两件事。至于解决你的问题,我根本没有理由使用结构,所以我将Periods改为一个类。
答案 1 :(得分:1)
Structs是值类型,而不是引用类型。如果您想通过引用传递它,则必须使用ref
关键字。请记住,它仍然是一个值类型,并将其分配给另一个变量将创建一个新的结构。
答案 2 :(得分:1)
问题出在DB.ModifyData<Period>(Data);
方法调用中。您的Data
字段是一个结构,结构会传递给任何方法按值,这意味着每次调用方法复制时都会创建结构传递给方法。实际上,您的ModifyData
方法正在修改在方法调用之后丢弃的Periods
结构的副本。