La API de .NET de pago de Stripe tiene una definición de clase genérica como la siguiente y me gustaría entender por qué la parte de restricción StripeEntity<T> debería ser del tipo T .
public abstract class StripeEntity<T> : StripeEntity where T : StripeEntity<T>De: https://github.com/stripe/stripe-dotnet/blob/master/src/Stripe.net/Entities/_base/StripeEntity.cs
Entiendo la sintaxis genérica, pero no entiendo por qué la clase se define de esta manera, el pensamiento detrás de ella. ¿Es este un patrón común en las clases genéricas y, de ser así, cuáles son los beneficios?
Se llama el patrón curiosamente recurrente , generalmente usado en C++.
Tiene un par de cosas a su favor, especialmente el hecho de que es una forma (muy limitada) de polimorfismo estático y, por lo tanto, evita los costos de llamar a funciones virtuales. Sin embargo, eso tiene más valor en C++ que en C#, debido a cómo se construyen el lenguaje y el tiempo de ejecución.
.Net también tiene mejores formas de lidiar con esto, por ejemplo, podría lograr algo similar de una manera más limpia mediante el uso de atributos y generadores de fuentes.