gpt4 book ai didi

c# - 为什么 ReSharper 告诉我这个表达式总是正确的?

转载 作者:IT王子 更新时间:2023-10-29 04:36:54 25 4
gpt4 key购买 nike

我有以下代码,它会告诉我是否在代码的其他地方使用了某个属性。这背后的想法是验证是否可以将具有 private setter 的属性设置为只读。

这里有多个问题,但主要问题是在构造函数外部对属性的赋值意味着它不会触发。此外,静态属性可能只在静态构造函数中有一个赋值来触发诊断。同样,实例属性只需要一个实例构造函数。

现在,我目前遇到的大多数情况都已考虑在内,但 ReSharper 在这段代码中向我发出警告,我似乎无法弄清楚它的逻辑。上面的规范翻译成这段代码:

var isStaticProperty = propertySymbol.IsStatic;
bool hasInstanceUsage = false;
bool hasStaticUsage = false;

foreach (var identifier in outerClass.DescendantNodes().OfType<IdentifierNameSyntax>())
{
var memberSymbol = context.SemanticModel.GetSymbolInfo(identifier);
if (memberSymbol.Symbol.Equals(propertySymbol))
{
var constructor = identifier.Ancestors().OfType<ConstructorDeclarationSyntax>()
.FirstOrDefault();
var isInConstructor = constructor != null;
var isAssignmentExpression = identifier.Ancestors()
.OfType<AssignmentExpressionSyntax>()
.FirstOrDefault() != null;

// Skip anything that isn't a setter
if (!isAssignmentExpression)
{
continue;
}

// if it is a setter but outside the constructor, we don't report any diagnostic
if (!isInConstructor)
{
return;
}

var isStaticConstructor = context.SemanticModel
.GetDeclaredSymbol(constructor).IsStatic;
if (isStaticConstructor && isStaticProperty)
{
hasStaticUsage = true;
}

if (!isStaticConstructor && !isStaticProperty)
{
hasInstanceUsage = true;
}
}
}

// We can't set it to readonly if it's set in both the instance
// and the static constructor
// We need a NAND operation: either it's never set,
// it's set in ctor 1 or it's set in ctor 2
if (!(hasStaticUsage & hasInstanceUsage))
{
context.ReportDiagnostic(Diagnostic.Create(
Rule, property.Identifier.GetLocation(), propertySymbol.Name));
}

随着警告

Expression is always true

在线

if (!(hasStaticUsage & hasInstanceUsage))

为什么会显示这个警告?后代数量未知,因此循环数量未知。每个循环都可以将hasStaticUsagehasInstanceUsage设置为true,这意味着经过2次循环(最早),这两个值都可以变为 true 并且 if 条件应该失败:NAND 返回 truetruetruefalse .

这是我打算完成的 bool 逻辑:

+----------------+------------------+--------+
| hasStaticUsage | hasInstanceUsage | result |
+----------------+------------------+--------+
| false | false | true |
| false | true | true |
| true | false | true |
| true | true | false |
+----------------+------------------+--------+

最佳答案

isStaticProperty 在循环外初始化:

var isStaticProperty = propertySymbol.IsStatic;

如果 isStaticProperty 为假,则此表达式:

 (isStaticConstructor && isStaticProperty)

始终为假,因此 hasStaticUsage 为假。

如果 isStaticProperty 为真,则此表达式:

 (!isStaticConstructor && !isStaticProperty)

始终为假,因此 hasInstanceUsage 为假。

在任何情况下,hasStaticUsagehasInstanceUsage 都不能同时为真。

关于c# - 为什么 ReSharper 告诉我这个表达式总是正确的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30700784/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com