我在将现有的 .NET 3.5 应用程序移植到 .NET 4.0 时遇到了一些麻烦。代码不是我自己写的,所以我不知道为什么会这样。
这是情况:如果应用程序从 Visual Studio 启动(发布或调试模式无关紧要)并且如果应用程序从调试文件夹启动,代码工作正常问题是发布部署,因为不是自 4.0 起(以及 4.5 版)运行良好:-/
这是最初的调用:
someObject.Text = Elements.GetElement(Int16.Parse(cb1.Text));
这是代码:
public class Elements : EnumBase<int, Elements>
{
public static readonly Elements Element1 = Create("Number 0", 0);
public static readonly Elements Element2 = Create("Number 1", 1);
private static Elements Create(string text, int value)
{
return new Elements() { text = text, value = value };
}
public static String GetElement(int id)
{
// The Following Code safes the day and let the release deploy work fine.
// It doesn´t matter if the condition becomes true or not to runtime.
/*
if (id == 999999999)
{
Elements el = Element1;
}
*/
// Release deploy works also fine if you do the following line in a loop instead of linq.
return BaseItemList.Single(v => v.Value == id).Text;
}
}
[Serializable()]
public class EnumBase<T, E> : IEqualityComparer<E>
where E : EnumBase<T, E>
{
private static readonly List<E> list = new List<E>();
protected string text;
protected T value;
protected static IList<E> BaseItemList
{
get
{
return list.Distinct(new EnumBase<T, E>(false)).ToList();
}
}
protected EnumBase()
{
list.Add(this as E);
}
/// <summary>
/// Constructor for distinct to avoid empty elements in the list
/// </summary>
private EnumBase(bool egal) {}
public string Text
{
get { return text; }
}
public T Value
{
get { return value; }
}
#region IEqualityComparer<E> Member
// ...
#endregion
}
关键是return BaseItemList.Single(v => v.Value == id).Text;
。它抛出一个InvalidOperationException
,因为在 Release
中public static readonly Elements Element1 = Create("Number 0", 0);
并public static readonly Elements Element2 = Create("Number 1", 1);
没有准备好。在发生异常的那一刻,BaseItemList 为空(BaseItemList.Count = 0)。我不确定为什么这发生在发布形式的 bin 文件夹中,而不是从 Visual Studio 中发布。对于测试,我在项目属性中停用了“优化代码”,但它没有帮助。
当然,该构造不是最好的,但我想知道 .Net 4.0 中有什么不同使代码更平坦。
感谢帮助