Until today, I thought that the following code would work:
class Program { static void Main(string[] args) { ITest test = new Test(); test.Log("testing"); Console.ReadLine(); } } interface ITest { void Log(string text, string function = ""); } class Test : ITest { public void Log(string text, [CallerMemberName] string function = "") { Console.WriteLine($"{function} : text"); } }
And, by work, I mean output something along the lines of:
Main : testing
However; it actually outputs:
: testing
CompilerServiceAttributes need to be on the Interface, and not on the implementation
class Program { static void Main(string[] args) { ITest test = new Test(); test.Log("testing"); Console.ReadLine(); } } interface ITest { void Log(string text, [CallerMemberName] string function = ""); } class Test : ITest { public void Log(string text, string function = "") { Console.WriteLine($"{function} : text"); } }
Why?
When you think about it, it does kind of make sense. Because you’re calling against the interface, the compiler injected value needs to be there; if you took the interface out of the equation, then the attribute needs to be on the class.
You live and learn!