Skip to content

When chaining item functions and comparing the result to empty string, the comparison will return false incorrectly.Β #12877

@ericstj

Description

@ericstj

Issue Description

Given the items:

    <ItemGroup>
      <TestItem Include="Test1" Foo="Bar" />
      <TestItem Include="Test2" />
    </ItemGroup>

And the comparison:

<Message Text="Don't have Test1/@Foo=Baz" Condition="'@(TestItem->WithMetadataValue('Identity', 'Test1')->WithMetadataValue('Foo', 'Baz'))' == ''" Importance="high" />

I would expect the condition to be true, but it is false. Emitting the result of the item function does show that it is an empty string.

Steps to Reproduce

Create a project, add the following.

  <Target Name="TestItem">

    <ItemGroup>
      <TestItem Include="Test1" Foo="Bar" />
      <TestItem Include="Test2" />
    </ItemGroup>

    <Message Text="@(TestItem->WithMetadataValue('Identity', 'Test1'))" Importance="high" />
    <Message Text="Have Test1" Condition="'@(TestItem->WithMetadataValue('Identity', 'Test1'))' != ''" Importance="high" />
    <Message Text="Don't have Test3" Condition="'@(TestItem->WithMetadataValue('Identity', 'Test3'))' == ''" Importance="high" />
    <Message Text="Have Test1/@Foo=Bar" Condition="'@(TestItem->WithMetadataValue('Identity', 'Test1')->WithMetadataValue('Foo', 'Bar'))' != ''" Importance="high" />
    <Message Text="Don't have Test1/@Foo=Baz" Condition="'@(TestItem->WithMetadataValue('Identity', 'Test1')->WithMetadataValue('Foo', 'Baz'))' == ''" Importance="high" />

  </Target>

build with dotnet msbuild /t:TestItem /tl:off

Expected Behavior

Emits:

  Test1
  Have Test1
  Don't have Test3
  Have Test1/@Foo=Bar
  Don't have Test1/@Foo=Baz

Actual Behavior

Emits:

  Test1
  Have Test1
  Don't have Test3
  Have Test1/@Foo=Bar

Analysis

No response

Versions & Configurations

MSBuild version 18.0.2+b0f34d51f for .NET

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions