в

Беларусь

Belarusian .NET User Group

Контакты

Для связи: info ( @ ) belarusdotnet.org

либо dotnetby ( @ ) gmail.com

Наши партнеры

Минский институт управления
 
ООО Альторос Девелопмент - компания-резидент Парка высоких технологий, которая специализируется на создании тиражных продуктов под заказ с использованием новейших технологий, включая .NET Framework 3.5 и Windows Mobile.
 
JetBrains UG Program Member

Этот Блог

Engler

C# 4.0 и dynamic

В какой-то момент игрался с dynamic и приведением типов в C# 4.0. Ну и получился примерно такой код.

По природе, такой код не должен скомпилироваться, т.к не существуетс неявного преобразования из dynamic в String.

Вобщем-то этот код и не компилируется, правда по причине Internal Compiler Error :-).

Забавно было увидеть, т.к ни разу еще не видел как падает компилятор.

Компитентные источники сообщили, что во внутренних билдах(которые не доступны широкой публике) этот баг исправлен.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Sample.Inner
{
    public class C
    {
        public static void Test()
        {
            dynamic d = "Ooops...";
            Print(d);
        }

        public static void Print(String p)
        {
            Console.WriteLine(p);
        }
    }
}

namespace Sample
{
    class Program
    {
        static void Main(string[] args)
        {
            Sample.Inner.C.Test();
        }
    }
}

 

Можно еще отметить следующий нюанс - если изменить область видимости метода Print,

таким образом:

private static void Print(String p) 

 то компилятор справедливо выдаст нормальную ошибку с описанием причины.

Опубликовано дек 12 2008, 02:04 от Engler
Теги :

Комментарии:

Пожалуйста, войдите с систему, используя свою учетную запись либо зарегистрируйтесь, если вы впервые на нашем сайте.
 

dr.gigabit сказал(а):

Это баг не компилятора, а C# байндера, который байндит динамический объект в C#. Компилятору вообще пофигу на dynamic, его дело -- емитить IL, а потом уже в рантайме из этого ILа вызывается байндер.

12 декабря, 2008 в 3:27
 

Engler сказал(а):

До C# байндера тут дело не доходит. Компилятор должен был упасть на стадии overload resolution. Ты можешь в этом убедится если поиграешься с модификатором доступа у метода Print - поставь private и увидишь, что произойдет.

12 декабря, 2008 в 4:43
 

dr.gigabit сказал(а):

нет счас под рукой компилятора. И что там произойдет если поменять на private? Не могу понять логики, dynamic -- рантайм разруливание. Если падает компилер -- тогда это какая-то оптимизация, которая пытается понять, что реализация уже есть и нужен обычный статический вызов. В этом суть "поставь private и увидишь, что произойдет" ?

15 декабря, 2008 в 3:18
 

Engler сказал(а):

Будет ошибка компиляции. Скажет она о том, что нету неявного преобразования из dynamic в String.

Я это веду к тому, что появление dynamic в параметрах метода - еще не значит, что разруливание уходит в рантайм.

15 декабря, 2008 в 11:11
 

dr.gigabit сказал(а):

Обязано уходить в рантайм :-)

В остально, имхо -- оптимизации. Приведи плиз IL код при разных модификаторах доступа.

16 декабря, 2008 в 10:48
 

Engler сказал(а):

Я честное слово пытаюсь понять твою точку зрения. Не получается. Откуда IL, если код не компилируется =))  ?

16 декабря, 2008 в 11:34
 

dr.gigabit сказал(а):

Ни в одном случае не компилится?

16 декабря, 2008 в 1:20
 

Engler сказал(а):

Ни в одном.

16 декабря, 2008 в 4:54

Сейчас на сайте

Community Server (Commercial Edition)