Esta es una sintaxis de la pregunta. Tengo una clase genérica que se hereda de una genérica de la clase base y la aplicación de una restricción de uno de los parámetros de tipo. Yo también quiero que la clase derivada para implementar una interfaz. Para la vida de mí, no puedo parecer para averiguar la correcta sintaxis.

Esto es lo que tengo:

DerivedFoo<T1,T2> : ParentFoo<T1, T2> where T2 : IBar { ... }

La primera cosa que me vino a la mente fue este:

DerivedFoo<T1,T2> : ParentFoo<T1, T2> where T2 : IBar, IFoo { ... }

Pero que es incorrecta, ya que causa la T2 a la necesidad de implementar tanto IBar y IFoo, no DerivedFoo para implementar IFoo.

He probado un poco de Google, el uso de los dos puntos, punto y coma, etc, pero me he vuelto cortos. Estoy seguro de que la respuesta es la cabeza slappingly simple.

  • Yo no podía entender @Adán respuesta cuando miré una vez, pero después de 2mins podía conseguir lo que es, gracias por la respuesta. Clase derivada tiene más de una aplicación puede ser este es el punto. De todos modos quiero mostrar su notación para los demás. «clase DerivedClass<Tipo> : ParentClass donde Tipo : IType» . Nada debe ser entre el último aplicado de la clase y de la cláusula where.
InformationsquelleAutor Dan Rigby | 2010-01-05

4 Comentarios

  1. 150

    De incluir la totalidad de la firma de su clase antes de definir restricciones genéricas.

    class DerivedFoo<T1, T2> : ParentFoo<T1, T2>, IFoo where T2 : IBar
    {
        ...
    }
    • A los demás, he interiorizado como este, una clase sólo tiene una cláusula where, y se va al final de cualquier & todas las restricciones de tipo genérico.
    • Se permite tener múltiples cláusulas where, clase de Prueba<T1,T2> donde T1 : Interfaz1 donde T2 : Interfaz2
    • sí, lo bwing dijo, también, cada una cláusula where puede tener varias restricciones… así que la sintaxis del post original es correcta, sólo significa algo diferente que el op quería. where T2 : IBar, IFoo sólo significa que T2 tiene que implementar ambas interfaces en lugar de DerivedFoo<T1,T2> la aplicación de IFoo
  2. 16

    Mi recomendación: cuando usted tiene una pregunta acerca de la sintaxis del lenguaje C#, leer la especificación; es por eso que nos publicarlo. Usted querrá leer la sección 10.1.

    Para responder a su pregunta específica, el orden de las cosas en la declaración de la clase es:

    • atributos, entre corchetes
    • modificadores («público», «estático», y así sucesivamente)
    • «parcial»
    • «clase»
    • el nombre de la clase
    • una lista separada por comas de parámetro tipo de declaraciones dentro de los corchetes angulares
    • un signo de dos puntos seguido de una lista separada por comas de los tipos de base (base de la clase e implementado interfaces, de la clase base debe ir primero si es que la hay)
    • tipo de limitaciones de los parámetros de
    • el cuerpo de la clase, rodeado por llaves
    • un punto y coma

    Todo lo de esa lista es opcional, excepto para la «clase», el nombre, y el cuerpo, pero todo lo que debe aparecer en ese orden si aparece.

    • Eric, mientras que respeto mucho como profesional y agradecemos su comentario, yo no puedo ayudar pero frustrado por lo que viene a través como un abrasivo respuesta. Usted está criticando a mí para la elección de hacer una pregunta sobre una programación de Q&a Un sitio a través de la búsqueda, descarga, y la búsqueda a través de un muy técnico 503 página de documento de Word enterrado fuera de un enlace en MSDN. Eso es bastante difícil. Este fue el uso más eficiente de mi tiempo y tiene el beneficio añadido de que puede ayudar a que alguien más tarde. El enlace a la C# Lang Especificaciones para los interesados es: msdn.microsoft.com/en-us/vcsharp/aa336809.aspx
    • Ninguna crítica fue la intención. Hay un sesgo generalizado en puro texto de la comunicación que hace que las simples declaraciones de hechos de sonido brusco y abrasivos; yo trato de leer de caridad cuando se presenta una lista de los hechos, y se recomienda que lo hagan tan bien. Mantengo mi recomendación; si usted tiene preguntas acerca de la sintaxis, la especificación de las respuestas de forma definitiva y comienza con una útil tabla de contenido para la localización de las definiciones de sintaxis específica.
    • Dan, la búsqueda de C# spec es tan simple como entrar ‘C# Spec’ en Google y pegando el ‘yo soy de la suerte’ botón. Y si usted es un profesional de C# developer, usted ya debe tener C# spec en formato PDF en su equipo. También, no me refiero a criticar tanto. Yo no estaba acostumbrado a la lectura de especificaciones antes, pero he empezado a leer gracias a Jon, Eric y Pavel que siempre cita a C# spec para cualquier pregunta. He encontrado que C# spec, a pesar de que podría ser difícil de leer, a veces, es una gran manera de aprender sobre el lenguaje.
    • Lippert: Justo lo suficiente. Gracias por su respuesta. Como una sugerencia constructiva, sería de gran ayuda si Microsoft podría integrar el contenido de la especificación directamente en MSDN, además de tener que existir como una descarga independiente. El Visual Studio .Net versión MSDN se ha integrado una versión de la especificación, pero no las versiones posteriores. He pensado en comprar Anders Hejlberg del libro, pero con .Net 4.0 vuelta de la esquina me resisto a todavía. amazon.com/C-Programming-Language-3rd/dp/0321562992 Gracias.
    • El documento en MS del sitio web .formato doc (soy consciente de que es la ubicación, ya he enlazado en mi comentario), donde se encuentra una versión en PDF? Gracias.
    • En ECMA del sitio web. ecma-international.org/publications/standards/Ecma-334.htm
    • La única pega es que el estándar ECMA senderos Microsoft especificación del lenguaje C# en la moneda. Por ejemplo, ECMA-334 no cubre LINQ o Lambdas. Mientras que habría trabajado para mi pregunta, me siento más inclinado a hacer referencia a la mayoría de documento actual.
    • Usted está absolutamente en lo correcto. Hasta ahora, para mis necesidades sencillas, la versión en PDF que ha trabajado.
    • Wow, se aprende algo todos los días…no sabía que la definición de una clase podría ser seguido por un punto y coma (no sé por qué te gustaría, pero estoy seguro que hay una razón). +1
    • C++ requiere que la declaración de la clase final en un punto y coma. Muchos de los desarrolladores de C# provienen de un C++ fondo; a veces sus dedos de poner el punto y coma sin que sus cerebros involucrarse. 🙂 Hay una serie de construcciones en C# que tomar un opcional semi donde C++ requiere uno. Es casi sólo un sutil conveniencia. Supongo que también le permite sutilmente llamada cuando un tipo de declaración final vs decir de un cuerpo de método declaración.

  3. 7
    public interface IFoo {}
    public interface IBar {}
    
    public class ParentFoo<T,T1> { }
    public class DerivedFoo<T, T1> : ParentFoo<T, T1>, IFoo where T1 : IBar { }
  4. 2
    public class KeyAndValue<T>
    {
        public string Key { get; set; }
        public virtual T Value { get; set; }
    }
    
    public class KeyAndValue : KeyAndValue<string>
    {
        public override string Value { get; set; }
    }

    Esta es una extensión fuera de las respuestas existentes. El valor predeterminado es string si no se proporciona un tipo. Yo no implementar una interfaz, pero que no requieren nada diferente de lo habitual.

Dejar respuesta

Please enter your comment!
Please enter your name here