== Why is this an issue?

https://learn.microsoft.com/en-us/dotnet/api/system.componentmodel.defaultvalueattribute[DefaultValue] does not make the compiler set the default value, as its name may suggest. What you probably wanted to use is https://learn.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.defaultparametervalueattribute[DefaultParameterValue]. 

The https://learn.microsoft.com/en-us/dotnet/api/system.componentmodel.defaultvalueattribute[DefaultValue] attribute from the `System.ComponentModel` namespace, is sometimes used to declare a member's default value. This can be used, for instance, by the reset feature of a visual designer or by a code generator.

[source,csharp]
----
public void DoStuff([DefaultValue(4)] int i) 
{ 
    // i is not automatically assigned 4
}
----

The https://learn.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.optionalattribute[Optional] attribute from the `System.Runtime.InteropServices` namespace is sometimes used to indicate that a parameter is optional, as an alternative to the language-specific construct.

[source,csharp]
----
public void DoStuff([Optional] int i) 
{ 
    // i would be assigned default(int) = 0 
}
----

The use of `[DefaultValue]` with `[Optional]` has no more effect than `[Optional]` alone. That's because `[DefaultValue]` doesn't actually do anything; it merely indicates the intent for the value. 

[source,csharp,diff-id=1,diff-type=noncompliant]
----
class MyClass
{
    public void DoStuff([Optional][DefaultValue(4)] int i, int j = 5)  // Noncompliant
    {
        Console.WriteLine(i);
    }

    public static void Main()
    {
        new MyClass().DoStuff(); // prints 0, since [DefaultValue] doesn't actually set the default, and default(int) is used instead
    }
}
----

More than likely, `[DefaultValue]` was used in confusion instead of `[DefaultParameterValue]`, the language-agnostic version of the default parameter initialization mechanism provided by C#.

[source,csharp,diff-id=1,diff-type=compliant]
----
class MyClass
{
    public void DoStuff([Optional][DefaultParameterValue(4)] int i, int j = 5) 
    {
        Console.WriteLine(i);
    }

    public static void Main()
    {
        new MyClass().DoStuff(); // prints 4
    }
}
----

Notice that you can't use both `[DefaultParameterValue]` and default parameter initialization on the same parameter.

[source,csharp]
----
void DoStuff([Optional][DefaultParameterValue(4)] int i = 5) // Error CS1745 Cannot specify default parameter value in conjunction with DefaultParameterAttribute or OptionalAttribute
----

== Resources

=== Documentation

* https://learn.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.optionalattribute[OptionalAttribute Class]
* https://learn.microsoft.com/en-us/dotnet/api/system.componentmodel.defaultvalueattribute[DefaultValueAttribute Class]
* https://learn.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.defaultparametervalueattribute[DefaultParameterValueAttribute Class]
* https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/named-and-optional-arguments#optional-arguments[Optional arguments (C# Programming Guide)]

=== Articles & blog posts

* https://stackoverflow.com/questions/40171095/use-optional-defaultparametervalue-attribute-or-not[Stack Overflow - Use "Optional, DefaultParameterValue" attribute, or not?]

include::../rspecator.adoc[]