¿Es posible crear un método genérico C # que acepte el tipo de valor (anulable) y el tipo de referencia?

Quiero crear un método simple que acepte ambostipo de valor ytipo de referencia parámetros, es decir, int es valor y string es referencia.

Entonces esto es con lo que empiezo:

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

Así que quiero poder usarlo así:

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

Pero el primer problema que encuentro es

El tipo 'T' debe ser un tipo de valor no anulable para poder usarlo como parámetro 'T' en el tipo genérico o método 'System.Nullable'

Para continuar, agrego una restricción de estructura a mi método

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

Pero ahora el método no aceptará las llamadas basadas en cadenas y me da este error:

El tipo 'cadena' debe ser un tipo de valor no anulable para poder usarlo como parámetro 'T' en el tipo o método genérico.

es posible? ¿O por qué se nos impide hacer esto?

Respuestas a la pregunta(1)

Su respuesta a la pregunta