3

我刚刚为 Jon Skeet 的Unconstrained Melody项目安装了 nuget 包,但是当我尝试使用它时,编译时出现错误:

类型参数“T”继承了冲突的约束“UnconstrainedMelody.IEnumConstraint”和“System.ValueType”

函数定义:

public void SetEnum<T>() where T : struct, IEnumConstraint {}

我错过了什么吗?我不应该使用 nuget 包吗?

4

3 回答 3

2

我可能是错的,但看起来虽然这个库在IEnumConstraint内部使用,并使其与文章中描述的后期构建步骤一起工作,但它并没有为您提供任何魔力,让您IEnumConstraint直接为自己的方法使用。

帖子中描述的方法是该类GetValues<T>提供的几种方法之一。UnconstrainedMelody.Enums还有其他可用的对象和方法。

如果您想将自己的泛型方法限制为枚举,您可以按照 Jon 用于构建此库的相同步骤,但在您自己的库上。在如何使用 PostSharp 执行此操作的评论中也有此示例。

于 2013-05-02T14:51:22.577 回答
2

将“无拘无束的旋律”的思想融入到

它带有必要的工具,可以将 IL 编织整合到构建过程中,并且正在积极维护中。因此,最好使用它而不是“不受约束的旋律”中的代码。对于 Enums,Enums.NET还提供了额外的改进。

ExtraConstraints 还支持向委托添加约束。

于 2017-07-24T04:59:12.237 回答
0

我还没有尝试过,但您似乎可以使用此 MSBuild 任务来完成与 ConstraintChanger 相同的事情。您必须在项目中包含 DelegateConstraint.cs 和 IEnumConstraint.cs 代码文件的副本。将构建任务应用于项目后,约束被换出,并且您引用该项目的其他项目将能够看到约束。

因此,它对于在您的解决方案中创建公共库项目本质上很有用,并且可以包含诸如您自己的自定义通用扩展方法之类的东西,这些方法类型受限于 System.Enum 和 System.Delegate。

https://code.google.com/p/unconstrained-melody/issues/detail?id=13

全部归功于:j...@friesen.us

I've found this project to be useful but wanted to have the build-time steps in MSBuild.  Adding this to your *.csproj files in which you use the constraints should accomplish the same thing as the Constraintchanger app.  Note the following:

1. I've added the two constraint types to my classes root namespace and the substitution looks for the types in the assembly's root namespace.

2. To make Resharper happier I've added the IEnumConstraint, DelegateConstraint type args into my project inside an #if UNCONSTRAINED ... #endif block like so:

public static T Parse<T>(string val) where T : struct
#if UNCONSTRAINED
, IEnumConstraint
#endif
{

}

This is purely optional but keeps resharper from complaining about the constraint not matching when using the project's code from another project in a common solution.

  <PropertyGroup>
    <BuildDependsOn>
      $(BuildDependsOn);
      SwapConstraints
    </BuildDependsOn>
  </PropertyGroup>
  <ItemGroup>
    <PreprocessorDefines Include="UNCONSTRAINED" />
  </ItemGroup>
  <UsingTask TaskName="FileReplace" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
    <ParameterGroup>
      <FileName ParameterType="System.String" Required="true" />
      <Source ParameterType="System.String" Required="true" />
      <Replacement ParameterType="System.String" Required="true" />
    </ParameterGroup>
    <Task>
      <Code Type="Fragment" Language="cs"><![CDATA[
string content = File.ReadAllText(FileName);
content = content.Replace(Source, Replacement);
File.WriteAllText(FileName, content);

]]></Code>
    </Task>
  </UsingTask>
  <Target Name="SwapConstraints">
    <GetFrameworkPath>
      <Output TaskParameter="Path" PropertyName="FW" />
    </GetFrameworkPath>
    <GetFrameworkSdkPath>
      <Output TaskParameter="Path" PropertyName="SDK" />
    </GetFrameworkSdkPath>
    <PropertyGroup>
      <ILDASM>"$(SDK)bin\NETFX 4.0 Tools\ildasm.exe"</ILDASM>
      <ILASM>"$(FW)\ilasm.exe"</ILASM>
      <IlFile>$(OutputPath)$(AssemblyName).il</IlFile>
      <DllFile>$(OutputPath)$(AssemblyName).dll</DllFile>
    </PropertyGroup>
    <Exec Command="$(ILDASM) /OUT=$(IlFile) $(DllFile)" WorkingDirectory="$(ProjectDir)" />
    <FileReplace FileName="$(IlFile)" Source="($(RootNamespace).DelegateConstraint)" Replacement="([mscorlib]System.Delegate)" />
    <FileReplace FileName="$(IlFile)" Source="([mscorlib]System.ValueType, $(RootNamespace).IEnumConstraint)" Replacement="([mscorlib]System.Enum)" />
    <FileReplace FileName="$(IlFile)" Source="($(RootNamespace).IEnumConstraint), [mscorlib]System.ValueType" Replacement="([mscorlib]System.Enum)" />
    <FileReplace FileName="$(IlFile)" Source="($(RootNamespace).IEnumConstraint)" Replacement="([mscorlib]System.Enum)" />
    <Exec Command="$(ILASM) /OUTPUT=$(DllFile) /DLL $(IlFile)" WorkingDirectory="$(ProjectDir)" />
  </Target>

Nov 22, 2013
#1 j...@friesen.us

Sorry, didn't mean to say #if UNCONSTRAINED ... #endif should be around type args for DelegateConstraint.  I've not messed with delegates to this point but I doubt that it would be necessary for them.
于 2015-02-12T02:03:04.700 回答