首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我要用这个简单的LINQ表达式引用System.Numerics呢?

为什么我要用这个简单的LINQ表达式引用System.Numerics呢?
EN

Stack Overflow用户
提问于 2015-09-03 16:08:17
回答 2查看 1.9K关注 0票数 12

首先,我知道如何让编译器访问它所要求的System.Numerics类型,我只是不明白为什么需要这样做。

我有一个基本的结构:

代码语言:javascript
复制
/// <summary>
///     Describes a single point on a spectrum.
/// </summary>
public struct SpectrumPoint
{
    public SpectrumPoint(double wavelength, double intensity)
    {
        Wavelength = wavelength;
        Intensity = intensity;
    }
    public double Intensity { get; }
    public double Wavelength { get; }
}

它用于需要double[]数组作为第三方依赖项的参数的类。我使用这个LINQy lambda链构造它们:

代码语言:javascript
复制
using Accord.Math;
// ...
double[] _wavelengths = points.Select(point => point.Wavelength).ToArray();
double[] _intensities = points.Select(point => point.Intensity).ToArray();

这是由这些LINQ表达式引起的错误:

误差CS0012 类型Complex是在未引用的程序集中定义的。 必须添加对程序集的引用。 System.Numerics, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089

我知道这种错误可能是由引用外部程序集的未使用的方法重载引起的,比如这里,但是 Complex**.和都没有引用Complex**.的重载。怎么回事?**

编辑:

这完全复制了编译问题,如果删除using Accord.Math;,编译问题就会消失:

代码语言:javascript
复制
using System.Linq;
using Accord.Math;

public class A
{
    public A(IEnumerable<double> d)
    {
        double[] arr = d.ToArray();
    }
}

(这里Accord.Math.)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-03 16:45:07

我相信问题是由Accord.Math.ComplexMatrix引起的--这是一个带有大量扩展方法的静态类,包括:

代码语言:javascript
复制
public static double[,] ToArray(this Complex[] c);

我发现错误的地方是:

代码语言:javascript
复制
using static Accor.Math.ComplexMatrix;

..。但是,对于相同名称空间中的其他类型,我没有使用类似的using static指令。

ToArray调用更改为类似于此的显式Enumerable.ToArray调用将使错误消失:

代码语言:javascript
复制
_wavelengths = Enumerable.ToArray(points.Select(point => point.Wavelength));
_intensities = Enumerable.ToArray(points.Select(point => point.Intensity));

..。这进一步表明是ComplexMatrix.ToArray造成了问题。

基本上,您不希望使用导入的任何扩展方法。选项:

  • 如上面所示直接调用Enumerable.ToArray
  • 删除using Accord.Math,并完全限定该命名空间中任何类型的使用。
  • 使用名称空间别名,例如using AM = Accord.Math,然后将其用于名称空间中的任何类型使用,例如var p3 = new AM::Point3()
  • 对名称空间中需要的任何类型使用类型别名,例如using Point3 = Accord.Math.Point3;,然后就可以正常使用var p3 = new Point3();

诚然,编译器可能会发现,无论Complex是如何定义的,这个调用都是不可行的,因为不可能有一个用户定义的从double[]Complex[]的转换,但是发现这会增加语言和编译器的复杂性。

下面是一个非常简短但完整的示例,它演示了这一点:

代码语言:javascript
复制
using System.Linq;
using Accord.Math; // Comment this out and the error goes away

class Test
{
    static void Main(string[] args)
    {
        args.ToArray();
    }
}    
票数 11
EN

Stack Overflow用户

发布于 2015-09-03 16:22:16

您可以查看一下Accord.Math项目,看看它是否引用了System.Numerics。您很可能有一些代码使用引用Accord.Math类型的Complex类型,因此需要引用Complex类型。

代码语言:javascript
复制
<ItemGroup> 
  <Reference Include="System" /> 
  <Reference Include="System.Data" /> 
  <Reference Include="System.Numerics" Condition="'$(Configuration)' != 'NET35'" /> 
  <Reference Include="System.Xml" /> 
</ItemGroup> 
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32380592

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档