带有结构的接口,通过引用使用泛型

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 通过反射获取类属性结构,类方法,类父类及其泛型,类,接口和包

《C#零基础入门之百识百例》(八十一)泛型概念介绍 -- 泛型类/结构/接口/委托

泛型 总结

泛型基本知识

Java+泛型

这是引用包含泛型的 C# 接口的 VB.NET 实现的 FxCop 错误吗?