== Why is this an issue?

Caller information attributes (``++CallerFilePathAttribute++``, ``++CallerLineNumberAttribute++``, ``++CallerMemberNameAttribute++``, and ``++CallerArgumentExpressionAttribute++``) provide a way to get information about the caller of a method through optional parameters. But they only work right if their values aren't provided explicitly. So if you define a method with caller info attributes in the middle of the parameter list, you put your callers in a bad position: they are forced to use named arguments if they want to use the method properly.


=== Noncompliant code example

[source,csharp]
----
void TraceMessage([CallerMemberName] string memberName = "",
  [CallerFilePath] string filePath = "",
  [CallerLineNumber] int lineNumber = 0,
  string message = null)  // Noncompliant
{
  /* ... */
}
----


=== Compliant solution

[source,csharp]
----
void TraceMessage(string message = null,
  [CallerMemberName] string memberName = "",
  [CallerFilePath] string filePath = "",
  [CallerLineNumber] int lineNumber = 0) 
{
  /* ... */
}
----


ifdef::env-github,rspecator-view[]

'''
== Implementation Specification
(visible only on this page)

include::message.adoc[]

'''
== Comments And Links
(visible only on this page)

include::comments-and-links.adoc[]
endif::env-github,rspecator-view[]
