The signature defined by the abstract class CallInvoker in Grpc.Core imposes a type constraint class on both TRequest and TResponse. This prevents the use of structs as responses for the remote method, e.g. it doesn't work with F# result type Result<'a, 'b> as the response type, as F# Result<_, _> is a struct type.
Why does CallInvoker need to impose TRequest: class and TResponse: class?
https://github.com/grpc/grpc/blob/master/src/csharp/Grpc.Core.Api/CallInvoker.cs