DelegateDecompiler icon indicating copy to clipboard operation
DelegateDecompiler copied to clipboard

Perplexing decompiled expression

Open bradmarder opened this issue 7 years ago • 0 comments

I don't quite understand what is going on with the following decompiled expression.

this => IIF(this.HasBar, this.Posts.Any(x => True), (this.HasBaz AndAlso this.Posts.Any((x => True ?? x => True))))

More specifically, this part is perplexing. this.Posts.Any((x => True ?? x => True)) I'm assuming it should only be this.Posts.Any(x => True) My basis for this assumption is if you change the || to just |, then it works fine.

When using that expression in conjunction with EFCore/Remotion.LINQ, those libraries fail to parse the expression and throw an exception. I don't know where the actual problem lies. Any help would be appreciated.

Here is the code.

using System;
using System.Collections.Generic;
using System.Linq;
using DelegateDecompiler;

namespace DecompileBug
{
    class Program
    {
        static void Main(string[] args)
        {
            var hasFoo = typeof(Blog)
                .GetProperties()
                .Single(x => x.Name == nameof(Blog.HasFoo))
                .GetMethod
                .Decompile()
                .ToString();

            Console.WriteLine(hasFoo);
            Console.ReadLine();
        }
    }
    public class Post { }
    public class Blog
    {
        public bool HasBar { get; }
        public bool HasBaz { get; }

        public IEnumerable<Post> Posts { get; }

        [Computed]
        public bool HasFoo =>
            (HasBar || HasBaz)
            && Posts.Any(x => true);
    }
}

bradmarder avatar Nov 27 '18 16:11 bradmarder