C # бросает отличия между VS2008 и IIS6 - PullRequest
2 голосов
/ 14 ноября 2008

У меня есть фрагмент кода на C #, который добавляет значения перечисления в раскрывающийся список по типу. Он требует, чтобы он вызывался с типом перечисления T1, хотя я не могу указать это как ограничение типа, потому что перечисления являются особым случаем, когда это невозможно. Это не главная проблема, поскольку она используется только для внутренних целей и задокументирована.

Description - это расширение System.Enum, которое возвращает значение DescriptionAttribute значения enum или ToString значения, если оно не указано.

Из-за этого я должен привести к System.Enum в части Cast оператора LINQ, а не к T1, в противном случае расширение Description недоступно.

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

Это нормально и работает на сервере веб-разработки Visual Studio 2008, но завершается неудачно с исключением приведения при запуске на IIS 6. Он запускается с неизменным, жестко перечисляемым перечисляемым параметром типа для заполнения страниц ASP.

System.InvalidCastException: неверное приведение из "% namespace.class + nameofenum%" для 'System.Enum. в System.Convert.DefaultToType (IConvertible значение, тип targetType, Провайдер IFormatProvider) в System.Convert.ChangeType (Object значение, Тип ConversionType, Провайдер IFormatProvider) в System.Linq.Enumerable.d__b0 1.MoveNext() at System.Linq.Enumerable.<SelectIterator>d__d 2.MoveNext () в System.Linq.Buffer 1..ctor(IEnumerable 1 источник) в System.Linq.Enumerable.ToArray [TSource] (IEnumerable`1 источник) в AddEnum [T1] (DropDownList me)

(пространство имен / имя класса скрыто мной)

Я не могу протестировать его на других версиях IIS, но кажется очень странным, что версия для разработки не соответствует производственной системе. Кто-нибудь знает, почему это так?

1 Ответ

5 голосов
/ 14 ноября 2008

Снято в темноте. Одна из платформ работает под управлением 3.5 RTM, а другая - под управлением 3.5 SP1. В этом случае вы, вероятно, столкнетесь с критическими изменениями, введенными в 3.5SP1, которые изменили способ работы .Cast (). Смотрите эти сообщения для более подробной информации

...