-
Notifications
You must be signed in to change notification settings - Fork 5.4k
Description
Related to:
dotnet/csharplang#905
https://github.com/dotnet/coreclr/issues/12877
In a method like:
public void Foo<T>(T t)
{
...
}I want to be able to do the equivalent of:
if (t is ISomeInterface)
{
((ISomeInterface)t).InterfaceMethod();
}but without incurring the associated boxing. I can work around https://github.com/dotnet/coreclr/issues/12877 with a hack like dotnet/coreclr@9a06301#diff-bc8ce62cfb625ddcc19d1f21b5c8b5c1R457, but that only addresses the is check; I'm not aware of any way currently to do the invocation without an allocation.
Example where this would be valuable:
dotnet/coreclr@9a06301#diff-bc8ce62cfb625ddcc19d1f21b5c8b5c1R427
Right now for this optimization in async methods, we have no way to special-case all ValueTask<T>s, instead having to special-case just those ValueTask<T>s for Ts we list here explicitly. If we had the ability to do the above pattern, we could make ValueTask<T> implement an internal interface that provided a Task AsTask() method that would let us fish out and use the underlying Task, which enable us to apply the optimization for all ValueTask<T>, regardless of the T.