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!