É possível criar um método genérico em C # que aceita o tipo de valor (anulável) e o tipo de referência?

Eu quero criar um método simples que aceite ambostipo de valor etipo de referência parâmetros, ou seja, int é value e string é referência.

Então é assim que começo:

public bool areBothNotNull<T>(T? p1, T? p2)
{
    return (p1.HasValue && p2.HasValue);
}

Então, eu quero poder usá-lo assim:

var r1 = areBothNotNull<int>(3, 4); // will be true
var r2 = areBothNotNull<int>(3, null); // will be false
var r3 = areBothNotNull<string>("three", "four"); // will be true
var r4 = areBothNotNull<string>(null, "four"); // will be false

Mas a primeira questão que encontro é

O tipo 'T' deve ser um tipo de valor não anulável para usá-lo como parâmetro 'T' no tipo ou método genérico 'System.Nullable'

Para continuar, adiciono uma restrição de estrutura ao meu método

public bool areBothNotNull<T>(T? p1, T? p2) where T : struct

Mas agora o método não aceita as chamadas baseadas em string e me fornece este erro:

O tipo 'string' deve ser um tipo de valor não anulável para usá-lo como parâmetro 'T' no tipo ou método genérico.

Isso é possível? Ou por que somos impedidos de fazer isso?

questionAnswers(1)

yourAnswerToTheQuestion