10

pls tell me in which version dynamic keyword is introduced ? I found strange behavior in VS2010. I set target framework to 3.5. But there is no compiler error. just crate a console application with target framework to .net 3.5 and use dynamic keyword .

Tim Lloyd
  • 37,954
  • 10
  • 100
  • 130
Saokat Ali
  • 1,055
  • 2
  • 12
  • 18

4 Answers4

14

The dynamic type was introduced in .Net 4.0.

The dynamic type is not a language only feature (i.e purely supported by the compiler). It relies on the DLR which is a .Net 4.0 feature which needs library support.

You cannot use dynamic and target the .Net 3.5 framework.

Tim Lloyd
  • 37,954
  • 10
  • 100
  • 130
11

When you use Visual Studio 2010, it defaults to C# 4.0.

You can not use C# 3.0 with Visual Studio 2010.

Even if you target .Net Framework 3.5, it will just use Framework 3.5 and not C# 3.0.

Now, since it defaults to C# 4.0, you get to use dynamic. But for that to work, you have to reference Microsoft.CSharp.dll. That assembly is compiled with v 4.0. You can't use it under v 3.5.

dynamic needs DLR (Dynamic Language Runtime) which is not there for previous framework versions.

That is why when you try to use dynamic under Framework 3.5 project, it will freak out.

So, to summarize, to use dynamic, use Framework 4.0.

decyclone
  • 30,394
  • 6
  • 63
  • 80
  • 2
    There is no such thing as "C# 3.5". C# 3.0 was introduced with .NET 3.5. – Etienne de Martel Dec 31 '10 at 06:54
  • 1
    Why is this down-voted? The main point is that you need `Microsoft.CSharp.dll`, which is true. +1 – user541686 Dec 31 '10 at 07:20
  • 1
    Etienne, 3.0 wasn't released as a framework like 2.0/3.5, it was released to coincide with the release of Windows Vista, since the framework wasn't 100% complete at the time, 3.0 shipped with Vista, when it was ready it was named 3.5. (AFAIK) – Phill Dec 31 '10 at 07:23
  • 1
    @Phill There was never a C# 3.5. – Tim Lloyd Dec 31 '10 at 07:33
  • @chibacity - *re-reads* on I thought it was referring to .NET Framework, not C#. My bad. – Phill Dec 31 '10 at 07:37
10

Dynamic keyword was introduced as part of C# 4.0 language - the compiler comes with VS 2010. Its a language feature and does not need runtime support (AFAIK) hence once complied with C# 4.0 compiler, shouldn't have any issue with earlier version of runtime. Changing target framework in VS 2010 does not switch the compiler (which remains at 4.0) - we will receive compiler error only if you use feature that targets new library or runtime. For example, in VS 2008, you could use lambda expressions or var keyword for target runtime 2.0 but extension methods were not available because extension attribute was part of 3.5 assembly.

EDIT: Above is wrong - dynamic keyword requires Framework 4.0. I couldn't even compile in VS2010 when target fx was changed to 3.5. I believe that OP might not have used the dynamic var later in the code so that compiler optimization would have removed it making OP believe that its working.

VinayC
  • 47,395
  • 5
  • 59
  • 72
  • 6
    The dynamic type is not a language only feature, it is supported by the DLR which is .Net 4. – Tim Lloyd Dec 31 '10 at 06:18
  • @chibacity, I would have but sadly don't have VS 2010 on current machine. You are most probably right in saying that DLR dependency is needed for dynamic to work - I believed otherwise as saokat is able to use it with Fx 3.5. – VinayC Dec 31 '10 at 06:35
  • Like chibacity said, I don't think this works, because there's a specific library needed for dynamically invoking methods that isn't available without .NET 4.0. – user541686 Dec 31 '10 at 06:40
  • @Lambert pls check it in VS2010 – Saokat Ali Dec 31 '10 at 06:43
  • 3
    This answer seems to be incorrect... @saokat: This code: `dynamic x = 10; x.ToString();` gives: Program.cs(12,4): error CS1969: One or more types required to compile a dynamic expression cannot be found. Are you missing references to Microsoft.CSharp.dll and System.Core.dll? – user541686 Dec 31 '10 at 07:16
  • @saokat, chibacity is absolutely correct! I couldn't even compile in VS2010 when target fx was changed to 3.5. Can you share your code that works - I believe that you might not have used the dynamic var later in your code so that compiler optimization would have removed it making you believe that its working. Try to print your dynamic and you should see the problem. – VinayC Dec 31 '10 at 11:51
1

Just for the sake of the knowledge: This technique is called 'Polymorphism through late binding'

It was introduced in .NET Framework 1.1. C# acquired this feature in version 4.0. In Visual Basic it was possible to start this withoud compilation errors.

Public Class Foo 
   Public Sub Bar()
   End Sub
End Class

Public Class Test
   Public Sub Test()
      Dim o as Object
      o = New Foo()
      ' This will compile and work
      o.Bar()
      ' This will also compile but will throw an exception
      o.NonExistingMember()
   End Sub
End Class

`

All the trick is in that the type "Object" played the role of the top level parent as well as acted as a dynamic variable

Oybek
  • 7,016
  • 5
  • 29
  • 49