Я генерации кода, который необходимо проверить равенство с помощью SyntaxGenerator
Как выяснить, если тип поддерживает оператор равенства
Пример:
if (property.Type.IsValueType || property.Type == KnownSymbol.String)
{
if (property.Type.TypeKind == TypeKind.Enum ||
property.Type.GetMembers("op_Equality").Length == 1)
{
var valueEqualsExpression = syntaxGenerator.ValueEqualsExpression(
SyntaxFactory.ParseName("value"),
SyntaxFactory.ParseExpression(fieldAccess));
return (IfStatementSyntax)syntaxGenerator.IfStatement(valueEqualsExpression, new[] { SyntaxFactory.ReturnStatement() });
}
...
Проблема заключается в том, что это не обрабатывает такие типы, как int
.
Guess Я ищу что-то вроде SupportsValueEquals(ITypeSymbol symbol)
Как я могу понять, если тип поддерживает равенство через ==
?
Вы уже являетесь специальными перегородками - только в особых случаях используются другие встроенные типы, которые имеют встроенные операторы равенства? –
Остерегайтесь того, что вы можете иметь более одного оператора равенства в любом типе. –
Это на самом деле очень хороший вопрос, потому что спецификация C# не имеет очень очевидного понятия о «равенстве ценности». Существует ссылочное равенство, и существует предопределенное равенство, но это не охватывает все понятия «равенства ценности». Например, 'Struct.Byte' не имеет' op_Equals' и 'byte' не имеет предопределенного оператора равенства, но применение' == 'to' byte' работает так или иначе, потому что есть неявное продвижение в 'int', которое * делает * предопределенное равенство. Интересно, почему генератор синтаксиса беспокоится об этом в первую очередь. Как он предлагает различать ароматы '==' (и почему)? –