You simply do not have .Sum() overloads where you can pass your method.
You are right, you can do this:
things.Sum(thing => GetAmount(thing))
thing => GetAmount(thing) - this part will basically create the anonymouse function, and .Sum() will get the overload for it.
One of the other ways to implement it (more obviouse so you can understand what is actually happening) is to create func yourself:
public decimal Total(IThing[] things) { return things.Sum(new Func<IThing, decimal>(GetAmount)); }
Actually, I get another compiler error with your code (I am using VS 2015).
Severity Code Description Project File Line Suppression State Error CS0407 'decimal Sample.GetAmount (IThing)' has incorrect return type
So, I think that you get this wired error only because the pre-compiler analyzer is not perfect.
I did a bit more research and tried to compile your code without a precompiler from the command line, for example:
C: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ csc.exe / t: exe /out:Program.exe Program.cs
And now the compiler will return the correct error:
Program.cs (13.56): error CS0121: the call is ambiguous between the following methods or properties: 'System.Linq.Enumerable.Sum<Lambda.IThing>(System.Collections.Generic.IEnumerable<Lambda.IThing>, System.Func<Lambda.IThing,decimal>)' and 'System.Linq.Enumerable.Sum<Lambda.IThing>(System.Collections.Generic.IEnumerable<Lambda.IThing>, System.Func<Lambda.IThing,decimal?>)'
As you can see, we got the correct error with the decimal type. Thus, the wied compiler error that we get somewhere in the sources of the preliminary compiler.