Дамы и господа,
Недавно я попробовал этот эксперимент:
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