Это говорит о том, что выполняйте немедленно.
, так что если я делаю:
var val = (function(){
var a = 0; // in the scope of this function
return function(x){
a += x;
return a;
};
})();
alert(val(10)); //10
alert(val(11)); //21
Fiddle: http://jsfiddle.net/maniator/LqvpQ/
var val = (function(){
return 13 + 5;
})();
alert(val); //18
Отклонение будет поддерживаться только в режиме safe - фактически, используя способности, которые CLR уже имеет. Поэтому примеры, которые я даю в книге по попытке использовать List<Banana>
как List<Fruit>
(или что бы это там было), по-прежнему не сработают, но некоторые другие сценарии будут.
Во-первых, это будет поддерживаться только для интерфейсов и делегатов.
Во-вторых, для этого требуется, чтобы автор интерфейса / делегата украшал параметры типа как in
(для контравариантности) или out
(для ковариации). Наиболее очевидным примером является IEnumerable<T>
, который только позволяет вам принимать значения «из» - это не позволяет добавлять новые. Это станет IEnumerable<out T>
. Это не повредит безопасности типов, но позволяет вам возвратить IEnumerable<string>
из метода, объявленного для возврата IEnumerable<object>
, например.
Контравариантность сложнее дать конкретные примеры использования интерфейсов, но это легко с делегатом. Рассмотрим Action<T>
- это просто метод, который принимает параметр T
. Было бы неплохо легко конвертировать Action<object>
в качестве Action<string>
- любой метод, который принимает параметр object
, будет прекрасным, если вместо него будет представлен string
. Конечно, C # 2 уже имеет ковариацию и контравариантность делегатов в некоторой степени, но через фактическое преобразование из одного типа делегата в другой (создание нового экземпляра) - см. Примеры P141-144. C # 4 сделает это более общим, и (я полагаю) избежит создания нового экземпляра для преобразования. (Это будет ссылка вместо этого.)
Надеюсь, что это немного очистит - пожалуйста, дайте мне знать, если это не имеет смысла!
Не то, чтобы Джон еще не накрыл его, но вот некоторые ссылки на блоги и видео от Эрика Липперта. Он неплохо объясняет это примерами.
Видео:
https://www.youtube.com/watch?v=3MQDrKbzvqU
List<Banana>
какIList<Fruit>
& quot; как сказал Арк-кун? Если да, то как это возможно, хотя параметр типа интерфейсаIList<T>
не определен как ковариантный (нетout T
, а простоT
). – gehho 23 October 2013 в 13:48