gpt4 book ai didi

c# - 将结果分配给变量时 NotNullWhen 是否应该工作?

转载 作者:行者123 更新时间:2023-12-05 05:45:06 24 4
gpt4 key购买 nike

我有以下采用 Type 的方法作为参数并检查它是否为 IEnumerable<T> .如果是,则返回 true 并设置 T 的类型在out变量,否则返回 false。

private static bool TryGetEnumeratedType(Type type, [NotNullWhen(true)] out Type? enumeratedType)
{
enumeratedType = null;
bool isEnumerable = type.GetInterfaces().Any(i => i.GetTypeInfo() == typeof(IEnumerable));

if (!isEnumerable)
{
return false;
}

Type? genericType = type.GetGenericArguments().FirstOrDefault();

if (genericType is null)
{
return false;
}

enumeratedType = genericType;

return true;
}

如果我这样调用方法,没有问题:

Type fieldType;

if (TryGetEnumeratedType(inType, out Type? type))
{
fieldType = type;
}
else
{
fieldType = inType;
}

但是如果我将结果分配给一个变量并检查该变量,我在分配 fieldType = type 时会收到编译器警告说type可能为空。

Type fieldType;
bool isEnumerable = TryGetEnumeratedType(inType, out Type? type);

if (isEnumerable)
{
fieldType = type;
}
else
{
fieldType = inType;
}

这是一个错误,还是我遗漏了什么?

最佳答案

我认为这与 NotNullWhen 无关。编译器只是不做那种工作——它不深入检查“那个变量是从哪里来的”。这样做可能 1) 难以实现,并且 2) 您不知道在哪里停止:编译器应该将调用堆栈提升到多高,以确保没有为您的值分配 null?这可能会非常耗费资源。 This答案对此进行了一些讨论。

考虑这两种方法,例如:

public int GetInt() //no warning
{
if (true)
return 1;
}

public int GetAnotherInt() //CS0161: not all code paths return a value
{
var @true = true;
if (@true)
return 1;
}

关于c# - 将结果分配给变量时 NotNullWhen 是否应该工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71445291/

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