1

In this example I had to explicitly declare the variable as IDictionary<string, string> instead of var but I don't understand why.

Can someone explain why when I originally declared it as var the Visual Studio tooltip indicated it was dynamic even though DictionaryHelper.ParseOptional() returns an IDictionary<string, string>?

ParseOptional is declared as:

public static IDictionary<string, string> ParseOptional(dynamic json, string variableName);

The mergeVariables parameter is coming from Json.Decode(), hence the dynamic variable.

I'm using Visual Studio 2019, .NET v4.7.2, C#7.3 in case it's relevant.

private static ICollection<IMergeVariable> ParseMergeVariables(dynamic mergeVariables)
{
    IDictionary<string, string> mergeDictionary = DictionaryHelper.ParseOptional(mergeVariables, "mergeVariables");

    return mergeDictionary?.Select(variable => new MergeVariable(variable.Key, variable.Value)).Cast<IMergeVariable>().ToList();
}
sixeyes
  • 483
  • 3
  • 14

1 Answers1

0

From Microsoft Docs:

The result of most dynamic operations is itself dynamic.

I believe this is because the types are resolved at runtime (hence "dynamic" typing).

Related:

Edit: I believe this case is covered by ECMA-334 C# Language Specification 5th Edition (December 2017), Section 12.7.6 Invocation expressions, subsection 12.7.6.1 General, which states that:

An invocation-expression is dynamically bound (§12.3.3) if at least one of the following holds:

•The primary-expression has compile-time type dynamic.

•At least one argument of the optional argument-list has compile-time type dynamic

In this case, the compiler classifies the invocation-expression as a value of type dynamic.

Chris Yungmann
  • 1,079
  • 6
  • 14