Использование 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-тесты.