可为空的引用类型-通过接受参数返回类型为可为空

时间:2019-01-07 22:27:03

标签: c# .net null nullable c#-8.0

我有一个方法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>

2 个答案:

答案 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情况)。

通过两种方法可以确保返回类型根据输入类型而有所不同。