netstandard1.0 /netstandard1.2和LINQ

时间:2016-11-21 09:44:59

标签: .net linq asp.net-core .net-core .net-standard

我正在将一个简单的库(没有deps)移植到netstandard1.0。对你们来说可能很容易,但是当我在一个简单的类lib上定位netstandard1.0时,我无法理解为什么会出现这个构建错误。

  

CS1061'tring'不包含'Any'的定义,也没有扩展方法'Any'接受'string'类型的第一个参数(你是否缺少using指令或汇编引用?)MyProject。 .NETStandard,Version = v1.0

所以,似乎抱怨Any方法;我推测的Linq库的扩展方法部分。 AFAIK,Linq是1.0的NETStandard.Libary元数据包的一部分。

有问题的代码:

var numberString= "1234";
var isAllDigits = numberString.Any(t => !char.IsDigit((t))

我的project.json

{
  "dependencies": {
       "NETStandard.Library": "1.6.0"
  },

  "frameworks": {
    "netstandard1.0": { }
  }
}

将我的project.json更改为netstandard.1.2可以解决它,但是如果Linq的东西存在于1.0并且应该能够编译..?

此外,便携性工具运行良好,并表示我的目标也可以低至netstandard1.0

所以:

如何在创建定位netstandard1.0的库时不支持System.Linq v.4.3.0?

3 个答案:

答案 0 :(得分:1)

由于.net核心的一个想法是保持库尽可能小,所以linq和许多扩展方法都在一个额外的包中。

尝试安装Install-Package System.Linq

我想指出的另一件事是非常有用的工具Reverse Package Search,它允许您搜索类并找到相应的.net核心包。非常有助于移植到.net核心。

答案 1 :(得分:0)

这是隐藏的一点。查看.NET标准矩阵herestring.Any的MSDN文章。

  

版本信息

     
      
  • 通用Windows平台:自8开始提供
  •   
  • .NET Framework:自3.5起可用
  •   
  • 可移植类库:受支持:可移植.NET平台
  •   
  • Silverlight:自2.0起可用
  •   
  • Windows Phone Silverlight:自7.0起可用
  •   
  • Windows Phone:自8.1开始
  •   

注意最新一点。由于.NET Standard需要在所有支持的平台上运行,因此它也必须在Windows Phone 8.1上运行。但是要以Windows 8.1为目标,您需要最低的.NET Standard 1.2。因此,如果要使用此方法,则无法定位netstandard1.0

您可以使用#if预处理程序指令将其删除,以用于.NET Standard< 1.2并使用其他功能,或者自己实现(即通过Regex)。

答案 2 :(得分:0)

好的,最后得到netstandard1.0我的库支持,包括System.Linq作为依赖。

我做了以下步骤:

  1. 删除NETStandard.Library上的dep,并在project.json
  2. 中明确包含这些deps
  3. 开始删除deps并验证项目是否仍为每个已删除的dep构建。
  4. 尝试将每个软件包降级到仍然有效的最低版本。
  5. 在3.降级期间,我终于得到了一个使用netstandard1.0支持的设置,System.Linq4.3.0一直降级为4.0.0

    4.3.0不起作用

    4.1.0不起作用

    4.0.0确实有效。

    https://www.nuget.org/packages/System.Linq/4.1.0 https://www.nuget.org/packages/System.Linq/4.0.0