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, OKvar b = new S { X = 1 };
Console.WriteLine(b.X); // 1, OKvar c = new T();
c.X = 1;
Console.WriteLine(c.X); // 1, OKvar 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
Здравствуйте, Алексей., Вы писали:
А>Что-то совсем печально с C# 3.0. Expression trees, я так понимаю, лучше вообще не использовать от греха подальше?
Ошибок хватает. Вот сегодня нашел еще две: в некоторых случаях неправильно обрабатываются overloaded operators и user-defined conversions.
Но в целом, от expression tree отказаться трудно — на них завязана большая часть LINQ. И основные сценарии все-таки протестированы достаточно хорошо.
Re[3]: Использование value-типов с новыми возможностями C# 3
Здравствуйте, nikov, Вы писали:
N>Ошибок хватает. Вот сегодня нашел еще две: в некоторых случаях неправильно обрабатываются overloaded operators и user-defined conversions. N>Но в целом, от expression tree отказаться трудно — на них завязана большая часть LINQ. И основные сценарии все-таки протестированы достаточно хорошо.
Nikov, скажите, если это не проф. секрет конечно, вам уже предлагали позицию SDET Lead в C# compiler team?
Re[4]: Использование value-типов с новыми возможностями C# 3
Здравствуйте, Кэр, Вы писали:
Кэр>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
А> class S : IInterface
А> struct S1 : IIInterface
А>
А>я не вижу разницу в коде
Разница class/struct. Это не должно влиять на результат, но из-за ошибки в компиляторе влияет. При обращении к члену, определенному в интерфейсе, у структуры, ограниченной этим интерфейсом, происходит ошибочная упаковка.
Re[3]: Использование value-типов с новыми возможностями C# 3
Здравствуйте, nikov, Вы писали:
N>Разница class/struct. Это не должно влиять на результат, но из-за ошибки в компиляторе влияет. При обращении к члену, определенному в интерфейсе, у структуры, ограниченной этим интерфейсом, происходит ошибочная упаковка.
Зашибись. Еще одна шикарная зарисовка на тему "не используйте mutable структуры".