diff --git a/documentation/17.05/solutions/platform-specifics/microsoft-windows/net/eiffel-net-language/eiffel-net/event-programming-agents.wiki b/documentation/17.05/solutions/platform-specifics/microsoft-windows/net/eiffel-net-language/eiffel-net/event-programming-agents.wiki
index e721a5cd..440d1cd5 100644
--- a/documentation/17.05/solutions/platform-specifics/microsoft-windows/net/eiffel-net-language/eiffel-net/event-programming-agents.wiki
+++ b/documentation/17.05/solutions/platform-specifics/microsoft-windows/net/eiffel-net-language/eiffel-net/event-programming-agents.wiki
@@ -76,7 +76,7 @@ Then the following assignment is valid.
my_procedure := agent no_argument_procedure
-What this means is that the agent created and associated with the procedure no_argument_procedure must conform to the type PROCEDURE [ANY, TUPLE]. The feature my_procedure (which is of type PROCEDURE [ANY, TUPLE]) can be attached at runtime to an agent representing a procedure with no open arguments, which indeed is what no_argument_procedure is.
+What this means is that the agent created and associated with the procedure no_argument_procedure must conform to the type PROCEDURE [TUPLE]. The feature my_procedure (which is of type PROCEDURE [TUPLE]) can be attached at runtime to an agent representing a procedure with no open arguments, which indeed is what no_argument_procedure is.
Now let's turn our attention to the other procedure two_argument_procedure. You might think that because it takes two arguments, that you would not be able to build an agent from it which could be assigned to the attribute my_procedure. But you can do it by closing the two arguments at the time that the agent is created, as in the following.
@@ -133,7 +133,7 @@ Now suppose we want to print the values of all the strings in my_strings
The availability of agents gives us new options. LINKED_LIST has a feature do_all which comes to it from its ancestor LINEAR. The do_all feature's signature looks like this:
- do_all (action: PROCEDURE [ANY, TUPLE [G]])
+ do_all (action: PROCEDURE [TUPLE [G]])
As an argument do_all takes an agent based on a procedure with one open argument which is the same type as the list items (in this class, G is the formal generic parameter representing the type of the items being stored). Then it traverses the list executing the routine associated with that agent and uses the current list item to satisfy the open argument.
@@ -190,8 +190,14 @@ Here again we'll use a feature of the LINKED_LIST class. There is a
my_list.do_if (agent print_on_new_line(?), agent {STRING}.has('!'))
+
The agent for the action is the same as we used earlier. We've added an agent for the test. It represents applying the has feature of the STRING class. Here the target is left open, because we want each of the strings in the list to be the target of has.
+Compatibility note
+
+Versions of the Kernel Library classes ROUTINE, PROCEDURE, FUNCTION and PREDICATE prior to EiffelStudio 17-05 had an extra generic parameter at the initial position; the usual actual generic parameter was ANY. It has been removed. The compiler has been engineered so that in almost all cases it will still accept the old style.
+
+