c# - 采用 List<T>[] 的 Action 委托(delegate)的问题

标签 c# arrays list delegates action

我有一个像这样声明的 Action 委托(delegate)。

private readonly Action<List<PSDPoint>[]> _psdAction;
_psdAction = AddPSDData;

PSDPoint 是一个非常简单的类。

public class PSDPoint
{
    public int Frequency { get; set; }
    public double Power { get; set; }
}

我正在尝试这样调用委托(delegate)。

private void PSDData(object sender, PSDEventArgs e)
{
    Dispatcher.Invoke(_psdAction, e.Data);
}

PSDEventArgs 看起来像这样。可以看到e.Data是同一种数据类型。

public class PSDEventArgs
{
    public List<PSDPoint>[] Data { get; set; }
    public string[] Channels { get; set; }
}

_psdAction 指向这个函数。我从来没有达到这个代码。

private void AddPSDData(List<PSDPoint>[] data)
{
    ...
}

我收到调度程序试图调用的错误。我不知道为什么。我正在传递正确的类型。我猜想拥有一系列列表是不是有点“时髦”?

Object of type 'System.Collections.Generic.List`1[DataLogger.Model.PSDPoint]' cannot be converted to type 'System.Collections.Generic.List`1[DataLogger.Model.PSDPoint][]'.

最佳答案

尝试以下操作

Dispatcher.Invoke(_psdAction, (object)e.Data);

问题在于 Invoke 的第二个参数采用了 params object[]。这样做的目的是支持具有可变数量参数的委托(delegate)。数组的内容映射到参数。第一个元素指向第一个参数,第二个元素指向第二个参数,依此类推。

当您使用 e.Data 调用它时,C# 编译器会看到一个数组。它不是将数组作为第一个参数传递,而是尝试将每个元素作为参数传递。通过转换为 object,您可以强制编译器将其解释为单个参数

关于c# - 采用 List<T>[] 的 Action 委托(delegate)的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7114342/

相关文章:

c# - Double.MinValue、MaxValue 错误的编译时间常量 -- mscorlib

python - 计算两个列表中的频率,Python

java - 关于字谜的几个问题

Python - 为什么这段代码被认为是一个生成器?

c - 我将如何使用数组来打印图像?

c# - 我如何获得单个文件的大小?

c# - 用C#比较两个ip

c# - WCF 不反序列化。为什么我的参数是 NULL?

javascript - 将 int16 数组转换为 float

java - Java 中数组的 ArrayList 到 2d 数组