У меня есть «рекурсивный универсальный интерфейс»:
public interface MyInterface<T> where T : MyInterface<T>
{
T DoSomething();
}
И я определил для него метод расширения:
public static class MyExtensions
{
public static T DoSomethingElse<T>(this T t)
where T : MyInterface<T>
{
Console.WriteLine("DoSomethingElse was called.");
return t.DoSomething();
}
}
И затем я реализовал интерфейс в структуре:
public struct MyStruct : MyInterface<MyStruct>
{
public MyStruct DoSomething()
{
Console.WriteLine("DoSomething was called.");
return new MyStruct();
}
}
И затем я вызвал метод расширения в main:
public class Program
{
static void Main(string[] args)
{
MyStruct x = new MyStruct();
MyStruct y = x.DoSomethingElse();
Console.ReadKey();
}
}
Вопрос: Когда вызывается DoSomethingElse
, попадает ли объект MyStruct x
в MyInterface
, или метод расширения работает непосредственно на x
?
У меня есть основания полагать, что оба:
- x в штучной упаковке: это будет иметь место, еслиинтерфейс не был рекурсивным, так что, возможно, в данном случае метод расширения требует что-то типа
MyInterface
для работы, поэтому бокс - x не упакован: параметр
T t
означает структуру MyStruct
напрямую, чтобы его можно было передавать без упаковки.
Я очень старался придумать способ проверить это, но не могу найти способ запечатлеть момент, когда структураприведен к типу intreface.
Прошу прощения за зверскоеназвание, но я не мог бы сказать это лучше, пожалуйста, не стесняйтесь редактировать его, если вы можете описать проблему в более простых терминах.