首先,我知道如何让编译器访问它所要求的System.Numerics类型,我只是不明白为什么需要这样做。
我有一个基本的结构:
/// <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链构造它们:
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;,编译问题就会消失:
using System.Linq;
using Accord.Math;
public class A
{
public A(IEnumerable<double> d)
{
double[] arr = d.ToArray();
}
}(这里为Accord.Math.)
发布于 2015-09-03 16:45:07
我相信问题是由Accord.Math.ComplexMatrix引起的--这是一个带有大量扩展方法的静态类,包括:
public static double[,] ToArray(this Complex[] c);我发现错误的地方是:
using static Accor.Math.ComplexMatrix;..。但是,对于相同名称空间中的其他类型,我没有使用类似的using static指令。
将ToArray调用更改为类似于此的显式Enumerable.ToArray调用将使错误消失:
_wavelengths = Enumerable.ToArray(points.Select(point => point.Wavelength));
_intensities = Enumerable.ToArray(points.Select(point => point.Intensity));..。这进一步表明是ComplexMatrix.ToArray造成了问题。
基本上,您不希望使用导入的任何扩展方法。选项:
Enumerable.ToArrayusing Accord.Math,并完全限定该命名空间中任何类型的使用。using AM = Accord.Math,然后将其用于名称空间中的任何类型使用,例如var p3 = new AM::Point3()。using Point3 = Accord.Math.Point3;,然后就可以正常使用var p3 = new Point3();。诚然,编译器可能会发现,无论Complex是如何定义的,这个调用都是不可行的,因为不可能有一个用户定义的从double[]到Complex[]的转换,但是发现这会增加语言和编译器的复杂性。
下面是一个非常简短但完整的示例,它演示了这一点:
using System.Linq;
using Accord.Math; // Comment this out and the error goes away
class Test
{
static void Main(string[] args)
{
args.ToArray();
}
} 发布于 2015-09-03 16:22:16
您可以查看一下Accord.Math项目,看看它是否引用了System.Numerics。您很可能有一些代码使用引用Accord.Math类型的Complex类型,因此需要引用Complex类型。
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Data" />
<Reference Include="System.Numerics" Condition="'$(Configuration)' != 'NET35'" />
<Reference Include="System.Xml" />
</ItemGroup> https://stackoverflow.com/questions/32380592
复制相似问题