函数c#的泛型参数

时间:2017-09-13 09:21:32

标签: c# generics

美好的一天! 无法理解为什么编译器将其作为错误高线。有人可以告诉我“为什么”。我错了什么? 所以,我有一个通用类

    public abstract class SimpleElement<TDataIndexer> where TDataIndexer:IDataIndexator 
{
    public TDataIndexr[] po_registr;
    protected Update updateDelegate;
}

另外,我有委托,处理更新可视组件

public delegate object Update(IDataIndexator[] regs);

我的委托需要参数类型IDataIndexer。我如何将泛型参数传递给该委托?

public delegate object Update(IDataIndexator[] regs);
public abstract class SimpleElement<TDataIndexer> where TDataIndexer:IDataIndexator 
    {
        public TDataIndexr[] po_registr;
        protected Update updateDelegate;
        public function foo(){
            this.updateDelegate(po_registr); // here is error that parameter should be IDataIndexator[], but not TDataIndexer[]
        }
    }

3 个答案:

答案 0 :(得分:2)

为了让您认为应该自动发生的事情,您的TDataIndexer必须被约束为class

public abstract class SimpleElement<TDataIndexer> 
    where TDataIndexer:class, IDataIndexator 
{ ...}

实例:http://rextester.com/KDI86395

答案 1 :(得分:1)

尝试使用.Cast

public interface IDataIndexator { }

public delegate object Update(IDataIndexator[] regs);
public abstract class SimpleElement<TDataIndexer> where TDataIndexer : IDataIndexator
{
    public TDataIndexer[] po_registr;
    protected Update updateDelegate;
    public void foo()
    {
        this.updateDelegate(po_registr.Cast<IDataIndexator>().ToArray()); // here is error that parameter should be IDataIndexator[], but not TDataIndexer[]
    }
}

答案 2 :(得分:0)

TDataIndexr : IDataIndexator并不意味着TDataIndexr[]在编译器眼中是IDataIndexator[]

创建IDataIndexator[]this.updateDelegate(po_registr.Cast<IDataIndexator>().ToArray());

在某种程度上,系统希望获得类型为Array<IDataIndexator>的参数,您将传递Array<SomeType>,其中typeof(SomeType) != typeof(IDataIndexator)。因此,编译器typeof(Array<IDataIndexator>) != typeof(Array<SomeType>)会产生错误。