Делегировать в качестве первого параметра метода расширения

Дамы и господа,

Недавно я попробовал этот эксперимент:

static class TryParseExtensions
{
    public delegate bool TryParseMethod<T>(string s, out T maybeValue);
    public static T? OrNull<T>(this TryParseMethod<T> tryParser, string s) where T:struct 
    {
        T result;
        return tryParser(s, out result) ? (T?)result : null;
    }
}

// compiler error "'int.TryParse(string, out int)' is a 'method', which is not valid in the given context"
var result = int.TryParse.OrNull("1");  // int.TryParse.OrNull<int>("1"); doesnt work either

// compiler error: type cannot be infered....why?
var result2 = TryParseExtensions.OrNull(int.TryParse, "2"); 

// works as expected
var result3 = TryParseExtensions.OrNull<int>(int.TryParse, "3");
      var result4 = ((TryParseExtensions.TryParseMethod<int>)int.TryParse).OrNull("4");

Меня интересуют две вещи:

  • Почему компилятор не может определить параметр типа "int"?

  • Правильно ли я понимаю, что методы расширений не обнаруживаются в типах делегатов, поскольку я предполагаю, что они на самом деле не относятся к этому типу (но являются «методом»), которые совпадают только с подписью делегата? Такой состав решает эту проблему. Нельзя ли включить сценарий 1 (не конкретно, конечно, а в целом)? Я предполагаю, с точки зрения языка / компилятора, и будет ли это действительно полезно, или я просто (пытаюсь) дико злоупотребляю здесь?

Жду некоторых идей. Thnx

9
задан chrisaut 31 May 2011 в 13:17
поделиться