title: How does a delegate receive its arguments?
body: <p>Here's a sample using the List collection class:</p>
  
  <pre><code>List&lt;int&gt; list = new List&lt;int&gt;();
  
  List&lt;int&gt; evenNumbers = list.FindAll(delegate (int i)
  {
  return (i % 2) == 0;
  });
  </code></pre>
  
  <p>I've often wondered how the delegate passed to FindAll() is itself called back once for each item in the list.</p>
  
  <p>This also leads to another question, from a piece of code I'm working with currently. It's using a lambda expression instead of a straight delegate:</p>
  
  <pre><code>    class SampleViewModel : ViewModelBase
      {
          private int quantitySaved;
          public int QuantitySaved
          {
              get { return quantitySaved; }
              set
              {
                  if (quantitySaved != value)
                  {
                      quantitySaved = value;
                      NotifyPropertyChanged(p =&gt; QuantitySaved);
                  }
              }
          }
  
        //class continues below....
      }
  </code></pre>
  
  <p>The ViewModelBase class looks like this (cut for brevity):</p>
  
  <pre><code>public abstract class ViewModelBase : DependencyObject, INotifyPropertyChanged 
  {
      public event PropertyChangedEventHandler PropertyChanged;
  
      protected virtual void NotifyPropertyChanged&lt;T&gt;(Expression&lt;Func&lt;ViewModelBase, T&gt;&gt; property)
      {
          MvvmHelper.NotifyPropertyChanged(property, PropertyChanged);
      }
  }
  </code></pre>
  
  <p>The 'p' in the SampleViewModel lambda resolves to a ViewModelBase when the QuantitySaved property is set, but how does that resolution actually work at runtime?</p>