Linq вызывает ошибку сборки - PullRequest
1 голос
/ 14 июня 2011

Я использую NAnt и CCNet на нашем сервере сборки. В последнее время, когда я занимаюсь локальным развертыванием, я получаю ошибки сборки, которые, похоже, связаны с Linq, обобщениями и делегатами.

Вот результат:

[nant] C:\Test\buildfiles\build.build
 Buildfile: ..........
 Target framework: Microsoft .NET Framework 3.5
 Target(s) specified: build

build:
   [csc] Compiling 192 files to 'C:\TEST\bin'.
   [resgen] Read in 78 resources from 'C:\Test\Resources'.
   [csc] c:\Test\src\randomfile.cs<10,10>: error CS0411: The type arguments for method 'System.Linq.Enumerable.Select<TSource,TResult><System.Collections.Generic.IEnumerable<TSource>, System.Func<TSource,TResult>>' cannot be inferred from the usage. Try specifying the type arguments explicitly

На моей машине я могу собрать без проблем (vs2010). Я использую последнюю версию NAnt 0.91b.


Обновление:

Проект имеет целевую структуру 3.5. Ниже приведен код, который генерирует ошибку (раздел возврата в первом методе):

public static RoleTypeIdAndName[] TranslateRoleTypes(RoleType[] roleTypes)
{
    return roleTypes.Select(TranslateRoleType).ToArray();
}

public static RoleTypeIdAndName TranslateRoleType(RoleType roleType)
{
    return new RoleTypeIdAndName
            {
                Name = roleType.Name,
                RoleTypeId = roleType.RoleTypeId
            };
}

Ответы [ 2 ]

1 голос
/ 15 июня 2011

Когда вы используете vs2010, вам нужно установить для него целевую платформу 4.0 в скрипте nant, или вы можете напрямую вызвать правильную версию (4.0) msbuild и передать файл решения.

Наш текущий скрипт сборки делает это так:

<target name="msbuild" depends="create.common.assembly.info">
    <echo message="Compiling ${msbuild.workingpath}\${solution.path}"/>
    <echo message="Build base path ${msbuild.path}"/>

    <exec program="msbuild.exe" basedir="${msbuild.path}" workingdir="${msbuild.workingpath}">
      <arg value="/p:Configuration=${project.configuration}" />
      <arg value="/v:q" />
      <arg value="/p:trackfileaccess=false" />
      <arg value="/t:Clean"/>
      <arg value="${solution.path}"/>
    </exec>

    <exec program="msbuild.exe" basedir="${msbuild.path}" workingdir="${msbuild.workingpath}">
      <arg value="/p:Configuration=${project.configuration}" />      
      <arg value="/v:q" />
      <arg value="/p:trackfileaccess=false" />
      <arg value="/t:Rebuild"/>
      <arg value="${solution.path}"/>
    </exec>
    <property name="msbuild.output.file" value="${msbuild.workingpath}/msbuild-output.xml"/>
    <move if="${file::exists(msbuild.output.file)}" file="${msbuild.output.file}" todir="${log.path}" failonerror="false" overwrite="true" />
  </target>

Где ${msbuild.path} равно <property name="msbuild.path" value="C:\Windows\Microsoft.NET\Framework\v4.0.30319" />

0 голосов
/ 14 июня 2011

Не видя ваш код, я думаю, это одна из ситуаций, упомянутых на этой странице .

...