Использование value-типов с новыми возможностями C# 3.0
От: nikov США http://www.linkedin.com/in/nikov
Дата: 23.12.07 10:34
Оценка: 317 (24)
Использование value-типов с новыми возможностями C# 3.0 (object initializers, expression trees) может давать неверные результаты в релизе VS 2008.

https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=319387
https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=319429
https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=319430

Один из примеров:

using System;

namespace Nikov.Bugs
{
    class Program
    {
        static void Main()
        {
            Foo<S>();
        }

        static void Foo<T>() where T : I, new()
        {
            var a = new S();
            a.X = 1;
            Console.WriteLine(a.X); // 1, OK

            var b = new S { X = 1 };
            Console.WriteLine(b.X); // 1, OK

            var c = new T();
            c.X = 1;
            Console.WriteLine(c.X); // 1, OK

            var d = new T { X = 1 };
            Console.WriteLine(d.X); // 0, Неверно!
        }
    }

    interface I
    {
        int X { get; set; }
    }

    struct S : I
    {
        public int X { get; set; }
    }
}


Будьте внимательны, не забывайте писать unit-тесты.
Re: Использование value-типов с новыми возможностями C# 3.0
От: Алексей.  
Дата: 23.12.07 17:34
Оценка: :)
Здравствуйте, nikov, Вы писали:

N>https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=319387

N>https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=319429
N>https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=319430

Что-то совсем печально с C# 3.0. Expression trees, я так понимаю, лучше вообще не использовать от греха подальше?
Re[2]: Использование value-типов с новыми возможностями C# 3
От: nikov США http://www.linkedin.com/in/nikov
Дата: 23.12.07 18:06
Оценка: 4 (1)
Здравствуйте, Алексей., Вы писали:

А>Что-то совсем печально с C# 3.0. Expression trees, я так понимаю, лучше вообще не использовать от греха подальше?


Ошибок хватает. Вот сегодня нашел еще две: в некоторых случаях неправильно обрабатываются overloaded operators и user-defined conversions.
Но в целом, от expression tree отказаться трудно — на них завязана большая часть LINQ. И основные сценарии все-таки протестированы достаточно хорошо.
Re[3]: Использование value-типов с новыми возможностями C# 3
От: Кэр  
Дата: 24.12.07 05:49
Оценка: +1
Здравствуйте, nikov, Вы писали:

N>Ошибок хватает. Вот сегодня нашел еще две: в некоторых случаях неправильно обрабатываются overloaded operators и user-defined conversions.

N>Но в целом, от expression tree отказаться трудно — на них завязана большая часть LINQ. И основные сценарии все-таки протестированы достаточно хорошо.

Nikov, скажите, если это не проф. секрет конечно, вам уже предлагали позицию SDET Lead в C# compiler team?
Re[4]: Использование value-типов с новыми возможностями C# 3
От: nikov США http://www.linkedin.com/in/nikov
Дата: 24.12.07 08:50
Оценка: :))) :)))
Здравствуйте, Кэр, Вы писали:

Кэр>Nikov, скажите, если это не проф. секрет конечно, вам уже предлагали позицию SDET Lead в C# compiler team?


Именно эту позицию — нет, не предлагали.
Re: Использование value-типов с новыми возможностями C# 3.0
От: Аноним  
Дата: 24.12.07 10:54
Оценка:
Здравствуйте, nikov, Вы писали:

День добрый
может кто-нибудь обьяснить почему при выполнении этого кода выводится
1
0
using System;

namespace ConsoleApplication11
{
    class Program
    {
        interface IInterface
        {
            int X { get; set; }
        }

        interface IIInterface
        {
            int X { get; set; }
        }

        class S : IInterface
        {
            public int X { get; set; }
        }

        struct S1 : IIInterface
        {
            public int X { get; set; }
        }

        static void ffgfg1<T>() where T : IIInterface, new()
        {
            var d = new T { X = 1 };
            Console.WriteLine(d.X);
        }

        static void ffgfg<T>() where T : IInterface, new()
        {
            var d = new T { X = 1 };
            Console.WriteLine(d.X);
        }

        static void Main(string[] args)
        {
            ffgfg<S>();
            ffgfg1<S1>();
        }
    }
}

я не вижу разницу в коде
Re[2]: Использование value-типов с новыми возможностями C# 3
От: nikov США http://www.linkedin.com/in/nikov
Дата: 24.12.07 11:07
Оценка:
Здравствуйте, Аноним, Вы писали:

А>
А>        class S : IInterface
А>        struct S1 : IIInterface
А>

А>я не вижу разницу в коде

Разница class/struct. Это не должно влиять на результат, но из-за ошибки в компиляторе влияет. При обращении к члену, определенному в интерфейсе, у структуры, ограниченной этим интерфейсом, происходит ошибочная упаковка.
Re[3]: Использование value-типов с новыми возможностями C# 3
От: Кэр  
Дата: 24.12.07 11:21
Оценка:
Здравствуйте, nikov, Вы писали:

N>Разница class/struct. Это не должно влиять на результат, но из-за ошибки в компиляторе влияет. При обращении к члену, определенному в интерфейсе, у структуры, ограниченной этим интерфейсом, происходит ошибочная упаковка.


Зашибись. Еще одна шикарная зарисовка на тему "не используйте mutable структуры".
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.