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

No fields configured for Bug.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions