Visual Studio 如何告诉VS成员不为null

nuypyhwy  于 2023-05-18  发布在  其他
关注(0)|答案(2)|浏览(178)

我有一门课

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);行说opAopB可能是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;行,opAopB都不是null,并且没有潜在的问题。
我试着把

[MemberNotNull(nameof(opA))]
        [MemberNotNull(nameof(opB))]
        private void SetOperator(Func<int> op) { /* ... */ }

但这并不影响我的目标

pbwdgjma

pbwdgjma1#

可以使用null-forgiving operator ( ! )

public void SetAdd()
        => SetOperator(() => (int)opA! + (int)opB!);
public void SetSubtract()
        => SetOperator(() => (int)opA! - (int)opB!);

基本上和“闭嘴,我知道的更好”是一样的。
或者使用pragma -#nullable

#nullable disable
    public void SetAdd()
        => SetOperator(() => (int)opA + (int)opB);
    public void SetSubtract()
        => SetOperator(() => (int)opA - (int)opB);
#nullable restore
gojuced7

gojuced72#

您可以使用空容运算符(!),它告诉编译器您绝对确定该值不会为null。您可以通过添加来实现这一点!在可空变量之后。
尝试更改行:
setoperator(()=>(int)opa +(int)opb);
致:
setoperator(()=>(int)opa!+(int)opb!);
这应该可以解决Visual Studio中的问题,并允许您编译代码。

相关问题