我有一个方法Foo,它接受一个字符串。如果字符串为null,它将执行某些操作;否则,它将执行其他操作(null是有效值)。然后,它返回相同的字符串。
这里是Foo,在C#8.0中具有可空引用类型禁用:
string Foo(string s)
{
// Do something with s.
return s;
}
void Bar()
{
string s = "S";
string s2 = Foo(s);
string n = null;
string n2 = Foo(n);
}
在启用可为空的引用类型之后,string n = null
会发出警告。这是有道理的,因为string
不再可以为空。我将其类型转换为string?
:
void Bar()
{
string s = "S";
string s2 = Foo(s);
string? n = null; // X
string? n2 = Foo(n);
}
现在Foo(n)
向我警告Foo对可空字符串的新厌恶。这也很有意义-Foo应该接受可为空的字符串,因为它支持null和non-null值。我更改了其参数,因此将类型返回为string?
:
string? Foo(string? s)
{
// Do something with s.
return s;
}
这次是string s2 = Foo(s)
,抱怨Foo返回了string?
,而我试图将其分配给string
。
我是否可以让流程分析理解以下事实:当我向Foo提供string
(而不是string?
)时,其返回值不能为null? / p>
答案 0 :(得分:1)
当参数const int MAX_BUF = 1000; // make this as large as is needed
char* sql_buffer = malloc(MAX_BUF * sizeof(char));
int length = 0;
length += snprintf(sql_buffer+length, MAX_BUF-length, "INSERT INTO myTable (id, format, size) VALUES");
for (int i=0; item=row[i]; i++) {
length += snprintf(sql_buffer+length, MAX_BUF-length, " (%d, '%s', %d)", item.id, item.format, item.size);
}
rc = sqlite3_exec(db, sql_buffer, NULL, NULL, NULL);
不为空时,这可能使返回值不为空。
s
答案 1 :(得分:-1)
是的,只有两种方法。一个接受string?
并返回string?
,另一个接受string
并返回string
。您可能想用后者来实现前者(检查null,如果非null,则调用其他方法,否则处理null情况)。
通过两种方法可以确保返回类型根据输入类型而有所不同。