带有结构的接口,通过引用使用泛型
Posted
技术标签:
【中文标题】带有结构的接口,通过引用使用泛型【英文标题】:Interfaces with structs, by reference using Generics 【发布时间】:2011-01-27 02:00:28 【问题描述】:对不起各位!我太喜欢代码了!我忘了把编译器错误。
这里是新版本的简化代码!
这是错误:
错误 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();
【问题讨论】:
您遇到什么错误?编译器错误(如果有的话)?例外(如果有的话)?没有按预期工作(如果是这样,它在做什么)? 这段代码在 2010RC 中编译得很好。你遇到了什么错误,在哪一行? 结构被称为“值类型”,因为它们是按值传递的,而不是按引用传递的。如果你想通过引用传递一些东西,传递一个引用类型。无论如何,可变结构是一种非常非常糟糕的编程习惯。理想情况下,你不应该在结构上使用 setter。 【参考方案1】:在您的代码中,您传递的不是带有结构的接口,而是传递一个实现接口的结构。这是两个完全不同的东西。至于解决您的问题,我根本没有理由使用结构,所以我会将 Periods 更改为一个类。
【讨论】:
【参考方案2】:问题出在DB.ModifyData<Period>(Data);
方法调用中。您的Data
字段是一个结构,结构被传递给任何方法按值,这意味着每次调用该结构的方法copy 时都会创建并传递给方法。所以实际上你的ModifyData
方法正在修改Periods
结构的副本,该结构在方法调用之后被丢弃。
【讨论】:
【参考方案3】:Structs 是值类型,而不是引用类型。如果你想通过引用传递它,你将不得不使用ref
关键字。请记住,它仍然是一个值类型,将其分配给另一个变量将创建一个新结构。
【讨论】:
以上是关于带有结构的接口,通过引用使用泛型的主要内容,如果未能解决你的问题,请参考以下文章
java 通过反射获取类属性结构,类方法,类父类及其泛型,类,接口和包