当前位置:  开发笔记 > 编程语言 > 正文

VS#8和IIS6之间的C#强制转换不同

如何解决《VS#8和IIS6之间的C#强制转换不同》经验,为你挑选了1个好方法。

我有一段C#代码,它按类型将枚举值添加到下拉列表中.它要求在T1为枚举类型的情况下调用它,尽管我不能将其指定为类型约束,因为枚举是特殊情况,这是不可能的.这不是主要问题,因为它仅在内部使用并记录在案.

Description是System.Enum的扩展,它返回枚举值的DescriptionAttribute的值或值的ToString(如果未指定).

因此,我必须在LINQ语句的Cast部分中转换为System.Enum而不是T1,否则说明扩展不可用.

public static void AddEnum(this System.Web.UI.WebControls.DropDownList me)
{
    Type t = Enum.GetUnderlyingType(typeof(T1));
    var l = Enum.GetValues(typeof(T1))
                .Cast()
                .Select(x => new ListItem(x.Description(),
                                          Convert.ChangeType(x, t)
                                                 .ToString()));
    me.Items.AddRange(l.ToArray());
}

这很好,适用于Visual Studio 2008s Web开发服务器,但在IIS 6上运行时失败并出现强制转换异常.它以不变的硬编码可枚举作为填充ASP页面的类型参数运行.

System.InvalidCastException:从'%namespace.class + nameofenum%'到'System.Enum'的转换无效.处于System.Linq.Enumerable.d__b0的System.Convert.ChangeType(对象值,类型conversionType,IFormatProvider提供程序)的System.Convert.DefaultToType(IConvertible值,类型targetType,IFormatProvider提供程序),System.Linq处的1.MoveNext() at System.Linq.Enumerable.d__d2.MoveNext().缓冲区1..ctor(IEnumerable1源)在AddEnum [T1]的System.Linq.Enumerable.ToArray [TSource](IEnumerable`1源)(DropDownList me)

(我掩盖的名称空间/类名)

我无法在其他版本的IIS上测试它,但是开发版本与生产系统不匹配似乎很奇怪.有人知道为什么吗?



1> JaredPar..:

在黑暗中拍摄.其中一个平台运行3.5 RTM,另一个运行3.5 SP1.如果是这样,你可能会遇到3.5SP1中引入的改变方式.Cast()运行的方式.有关详细信息,请参阅这些帖子

http://blogs.msdn.com/ed_maurer/archive/2008/02/16/breaking-change-in-linq-queries-using-explicitly-typed-range-variables.aspx

http://blogs.msdn.com/dinesh.kulkarni/archive/2008/08/10/net-fx-3-5-sp1-two-perf-improvements-linq-to-objects-and-linq-to- sql.aspx

推荐阅读
手机用户2402851155
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有