Lo más cerca que puede obtener es una restricción de tiempo de ejecución.
Editar: Originalmente puse el control en tiempo de ejecución en la llamada del constructor. Eso en realidad no es óptimo, ya que incurre en gastos generales en cada instanciación; Creo que sería mucho más sensato para poner el cheque en el constructor estático, que se invoca una vez por tipo usado como parámetro T
para su tipo Blah<T>
:
public class Blah<T> {
static Blah() {
// This code will only run ONCE per T, rather than every time
// you call new Blah<T>() even for valid non-string type Ts
if (typeof(T) == typeof(string)) {
throw new NotSupportedException("The 'string' type argument is not supported.");
}
}
}
Obviamente no es ideal, pero si poner esta restricción en su lugar y documentar el hecho de que string
no es un argumento de tipo compatible (por ejemplo, a través de comentarios XML), debe obtener en algún lugar cerca de la efectividad de una restricción en tiempo de compilación.
no creo que esto sea posible, pero ¿por qué necesitarías algo como esto? – Carsten
¿Cuál es el comportamiento deseado cuando alguien intenta pasar un tipo que no es compatible? –
De hecho, estaba tratando de excluir el tipo de cadena, pero resulta que usar T: struct funciona para lo que estoy tratando de hacer ya que mi clase no funcionará para tipos complejos de todos modos. –