Наткнулся на предупреждение компилятора C#, цель которого мне пока что неясна категорически. Код:
public class Base
{
public virtual void Do() { }
}
public class Derived : Base
{
public delegate void VoidHandler();
public override void Do()
{
VoidHandler lala = delegate() { base.Do(); };
}
}
Это вызывает warning:
Access to member 'Temp.Base.Do()' through a 'base' keyword from an anonymous method or iterator results in unverifiable code. Consider moving the access into a helper method on the containing type.
В документации в качестве рационального объяснения, зачем нужно это предупреждение говорится:
Calling virtual functions with the base keyword inside the method body of an iterator or anonymous methods will result in unverifiable code. Unverifiable code will fail to run in a partial trust environment.
Хм, смотрим reflector-ом:
public class Base
{
public virtual void Do()
{
}
}
public class Derived : Base
{
[CompilerGenerated]
private void abcd1() //Имя метода изменено, чтобы оно удовлетворяло правилам c#
{
base.Do();
}
public override void Do()
{
VoidHandler handler1 = new VoidHandler(this.abcd1);
}
public delegate void VoidHandler();
}
Мы видим, что компилятор сделал тот самый хелперный метод, о котором говорится в warning-е. Такой код компилируется без проблем и не содержит никаких криминальных вещей.
Ну что же, осталось только проверить, правду ли говорят, что в partial trust окружении, такой код не будет работать. Для этого берем студию с установленными расширениями для .net 3.0, быстренько делаем .xbap приложение, публикуем на iis и запускаем его в браузере на другом компьютере. Все работает, Derived.Do вызывается отлично.
Возникают вопросы:
1. Существуют ли ситуации, когда код, похожий на приведенный, действительно не работает в partial trusted окружении?
2. Какова цель этого warning-а? Не является ли он заведомо ненужным?
Здравствуйте, Красин, Вы писали:
К>Возникают вопросы:
К>1. Существуют ли ситуации, когда код, похожий на приведенный, действительно не работает в partial trusted окружении?
К>2. Какова цель этого warning-а? Не является ли он заведомо ненужным?
Разбор этого ворнига:
http://blogs.msdn.com/ericlippert/archive/2005/11/14/492607.aspx
C Уважением, Andir!
using( RSDN@Home 1.2.0 alpha rev. 652 ) { /* Работаем */ }
чесно сказать смеялся над названием темы, а я вот обхожусь без анонимности и все ок.
данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение