property new error check caracteristicas body c# generics mono c#-6.0

c# - new - nameof con genéricos



nameof in c# (1)

Espero algunos detalles sobre los parámetros de tipo

La "especificación" dice :

Resultado de nameof. El resultado de nameof depende de los símbolos a los que se limita su argumento:

Uno o más miembros: si todos los miembros tienen el mismo nombre de metadatos, el resultado de nameof es ese nombre; de lo contrario es un error "Este argumento se refiere a múltiples elementos con nombres diferentes". El nombre de los metadatos de un miembro I or I <isA1 ... AK> `es simplemente" I "después de que se hayan aplicado las transformaciones del identificador estándar.

El parámetro <T> se elimina debido a las transformaciones del identificador estándar (sección §2.4.2 en la especificación C #) que no permiten <> como identificadores válidos. Primero se elimina cualquier @ principal, luego se transforman las secuencias de escape de Unicode y luego se eliminan los caracteres de formato. Esto, por supuesto, todavía sucede en tiempo de compilación. También puede ver esto cuando intenta imprimir el nombre de un tipo genérico:

typeof(List<string>).Name;

Resultará en:

List`1

¿Esto se debe a que nameof es una construcción en tiempo de compilación y los genéricos son tipos inicializados en tiempo de ejecución? ¿O hay alguna otra limitación?

El segundo error se especifica como no válido por diseño para evitar complicaciones de resolución de sobrecarga dentro de nameof :

Permitir argumentos de tipo genérico? Presumiblemente ''sí'' al nombrar un tipo, ya que así es como funciona el enlace de expresión. Y presumiblemente ''no''. al nombrar un grupo de métodos, ya que los argumentos de tipo se usan / deducen durante la resolución de sobrecarga, y también sería confuso tener que lidiar con eso en nameof.

Podemos ver eso claramente en el código base de Roslyn:

private BoundExpression BindNameofOperatorInternal(InvocationExpressionSyntax node, DiagnosticBag diagnostics) { CheckFeatureAvailability(node.GetLocation(), MessageID.IDS_FeatureNameof, diagnostics); var argument = node.ArgumentList.Arguments[0].Expression; string name = ""; // We relax the instance-vs-static requirement for top-level member access expressions by creating a NameofBinder binder. var nameofBinder = new NameofBinder(argument, this); var boundArgument = nameofBinder.BindExpression(argument, diagnostics); if (!boundArgument.HasAnyErrors && CheckSyntaxForNameofArgument(argument, out name, diagnostics) && boundArgument.Kind == BoundKind.MethodGroup) { var methodGroup = (BoundMethodGroup)boundArgument; if (!methodGroup.TypeArgumentsOpt.IsDefaultOrEmpty) { // method group with type parameters not allowed diagnostics.Add(ErrorCode.ERR_NameofMethodGroupWithTypeParameters, argument.Location); } else { nameofBinder.EnsureNameofExpressionSymbols(methodGroup, diagnostics); } } return new BoundNameOfOperator(node, boundArgument, ConstantValue.Create(name), Compilation.GetSpecialType(SpecialType.System_String)); }

Estaba experimentando con nameof con genéricos. No obtuve el resultado que esperaba. No estoy seguro de si esto es parte de la especificación o no.

class MainClass { public static void Main (string[] args) { Console.WriteLine ($"Hello { nameof(FooBar<string>)! }"); } } class FooBar<T> { }

La salida que obtengo es

Hola FooBar!

Espero algunos detalles sobre los parámetros de tipo.

Lo intenté con un método y eso falla con un error del compilador:

class MainClass { public static void Main (string[] args) { Console.WriteLine ($"Hello { nameof(Do<string>) }"); } public static T Do<T>() {} }

Error CS8084: un argumento para nombre de operador no puede ser un grupo de métodos con argumentos de tipo (CS8084) (foo)

¿Esto se debe a que nameof es una construcción en tiempo de compilación y los genéricos son tipos inicializados en tiempo de ejecución? ¿O hay alguna otra limitación?