2012-02-01 6 views
5

Estoy intentando crear el siguiente nombre de clase de la firma:restricción de clase debe llegar antes que cualquier otra limitación

public class MyClass<T> where T : struct, MyBase 

(estoy usando struct para constreñir a enumeraciones)

estoy error

recibiendo
The class type constraint 'MyBase' must come before any other constraints 

Entiendo el mensaje, sin embargo, reorganizando el código No puedo pasar ese u otro error de sintaxis. ¿Cómo puedo arreglar esa línea en todo caso?

Si tengo que, eliminaré struct.

Gracias

+0

gracias a todos por sus diferentes opciones debido a que ustedes lo leen de diferentes maneras. –

+1

Las malas noticias viajan despacio, no puede restringir un argumento de tipo a System.Enum. La historia no fue amable con las enumeraciones, se volvieron estructuralmente incompatibles al tener diferentes tamaños para su tipo de implementación. Una optimización demasiada en el lenguaje C, pegado a C# debido a la interoperabilidad. –

Respuesta

7

Quizás quiso decir class MyClass<T> : MyBase where T : struct?

+1

Gracias. Cuando probé algo similar a esto, estaba agregando una coma ','. "La luz es verde, la trampa está limpia". –

1

Usted está definiendo <T> como dos diferentes tipos. struct es un tipo de valor donde MyBase es una clase que hace referencia a un tipo de referencia. No es algo que sea intercambiable.

En este caso, sería ya sea:

public class MyClass<T> where T : struct

o

public class MyClass<T> where T : MyBase

Here es así más información sobre los medicamentos genéricos y la forma de utilizarlos.

0

Si T debe haber una struct, no puede heredar de cualquier otro tipo ... Los tipos de valor no son compatibles con la herencia.

16

Las restricciones se "editan" juntas; all las restricciones deben ser satisfechas.

bajo qué circunstancias puede ser tanto T un no anulable tipo de valor y también ser convertir implícitamente a la MyBase clase a través de la identidad, el boxeo o referencia conversión?

No existen tales circunstancias, por lo que no existe un posible argumento de tipo que satisfaga las restricciones de T. En lugar de dejar que defina un conjunto de restricciones que no se pueden cumplir, el compilador simplemente no lo permite. No puede indicar que necesita la restricción struct y una restricción class type.

estoy usando struct para constreñir a las enumeraciones

que ilustra mi punto. Como no hay enumeraciones que hereden de MyBase, no se pudo cumplir la restricción.

¿Puedes describirme qué pensabas que significaba esto? Por ejemplo, ¿creía que significaba "cualquier tipo de valor que no admite nulos o de cualquier tipo que sea convertible a MyBase"? Estoy interesado en aprender por qué las personas creen cosas falsas sobre C# para que pueda tratar de mejorarlo.

ACTUALIZACIÓN: Ah, ya veo - MyBase está destinado a ser la clase base de MyClass<T>, no la clase base de T. En C#, que va:

class [class name] < [generic type parameters] > 
    : [base classes and interfaces] 
    where [type parameter] : [constraints] 

usted tiene que poner la base de clases e interfaces antes de las limitaciones, de lo contrario el compilador piensa que son las restricciones.

0

No es 100% seguro de esto, pero una revisión rápida de MSDN viene con este where (generic type constraint) (C# Reference):

public class MyClass<T, U> where T : MyBase where U : struct 

No estoy seguro de que eso es lo que estás buscando sin embargo.

+1

Esto sería válido si hubiera alguna indicación de que necesitaba dos tipos paraterizados distintos, uno independiente del otro, pero no existe tal indicación en este momento. Parece que simplemente tiene deseos competitivos con respecto a las restricciones para un solo parámetro de tipo. –

+0

@AnthonyPegram - Ese es un punto válido, aunque leí la pregunta de manera diferente. No está del todo claro (para mí) lo que OP está tratando de lograr, razón por la cual pongo la advertencia al final. – Tim

Cuestiones relacionadas