我有一门课
class Operation
{
private int? opA = null;
private int? opB = null;
private Func<int>? opFunc = null;
public void SetOperandA(int value)
=> opA = value;
public void SetOperandB(int value)
=> opB = value;
public void SetAdd()
=> SetOperator(() => (int)opA + (int)opB);
public void SetSubtract()
=> SetOperator(() => (int)opA - (int)opB);
public void SetOperator(Func<int> op)
{
if (opA is null || opB is null)
throw new Exception("Both operands must be set first!");
opFunc = op;
}
public int Evaluate()
{
if (opFunc is null)
throw new Exception("Operator must be set first!");
return opFunc();
}
}
问题是,在SetAdd()
函数中,VS抱怨SetOperator(() => (int)opA + (int)opB);
行说opA
和opB
可能是null
,即使根据SetOperator()
的工作方式,它们永远不应该都是null
。
我想告诉VS这就好像我在做
public void SetMultiply()
{
if (opA is null || opB is null)
throw new Exception("Both operands must be set first!");
opFunc = () => (int)opA * (int)opB;
}
其中VS能够推断出在opFunc = () => (int)opA * (int)opB;
行,opA
和opB
都不是null
,并且没有潜在的问题。
我试着把
[MemberNotNull(nameof(opA))]
[MemberNotNull(nameof(opB))]
private void SetOperator(Func<int> op) { /* ... */ }
但这并不影响我的目标
2条答案
按热度按时间pbwdgjma1#
可以使用null-forgiving operator (
!
):基本上和“闭嘴,我知道的更好”是一样的。
或者使用pragma -
#nullable
:gojuced72#
您可以使用空容运算符(!),它告诉编译器您绝对确定该值不会为null。您可以通过添加来实现这一点!在可空变量之后。
尝试更改行:
setoperator(()=>(int)opa +(int)opb);
致:
setoperator(()=>(int)opa!+(int)opb!);
这应该可以解决Visual Studio中的问题,并允许您编译代码。