C#-如何使用空List作为可选参数

发布于 2024-11-27 20:57:10 字数 104 浏览 2 评论 0原文

有人可以举个例子吗?

我尝试过 nullstring.Empty 和对象初始化,但它们不起作用,因为默认值在编译时必须是常量

Can somebody provide a example of this?

I have tried null,string.Empty and object initialization but they don't work since default value has to be constant at compile time

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

烛影斜 2024-12-04 20:57:10

只需使用 null 合并运算符和空 List 的实例,

public void Process(string param1, List<string> param2 = null) 
{
    param2 = param2 ?? new List<string>();

    // or starting with C# 8
    param2 ??= new List<string>();
}

问题在于,如果“param2”为 null 并且您分配了一个新引用,那么在调用中将无法访问它语境。

Just use the null coalescing operator and an instance of empty List<string>

public void Process(string param1, List<string> param2 = null) 
{
    param2 = param2 ?? new List<string>();

    // or starting with C# 8
    param2 ??= new List<string>();
}

The problem with this is that if "param2" is null and you assign a new reference then it wouldn't be accessible in the calling context.

第七度阳光i 2024-12-04 20:57:10

您还可以使用 default 执行以下操作,它是编译时常量(在 List 的情况下为 null):

void DoSomething(List<string> lst = default(List<string>)) 
{
    if (lst == default(List<string>)) lst = new List<string>();
}

您可以进一步简化为:

void DoSomething(List<string> lst = default) 

You may also do the following using default which IS a compile-time-constant (null in the case of a List<T>):

void DoSomething(List<string> lst = default(List<string>)) 
{
    if (lst == default(List<string>)) lst = new List<string>();
}

You can simplify this even further to:

void DoSomething(List<string> lst = default) 
叹倦 2024-12-04 20:57:10

这是不可能的。您应该改用方法重载。

public static void MyMethod(int x, List<string> y) { }
public static void MyMethod(int x)
{
    MyMethod(x, Enumerable<string>.Empty());
}

It is impossible. You should use method overloading instead.

public static void MyMethod(int x, List<string> y) { }
public static void MyMethod(int x)
{
    MyMethod(x, Enumerable<string>.Empty());
}
最笨的告白 2024-12-04 20:57:10

正如其他人提到的,您将 null 分配给可选参数,在较新的版本中,当使用 enable 时,您需要使用可为空注释来标记参数( ?) 并为其分配一个 null 值,否则会导致错误 CS8625 - Cannot conversion null Literals to non-nullable引用类型。

void DoSomething(string param, List<string>? optional = null)
{
   // Check if the parameter is null, if so create empty list
   optional ??= new();

   ...
} 

As others mentioned you assign null to the optional parameter, in newer versions when using <Nullable>enable</Nullable> you need to mark the parameter with the nullable annotation (?) and assign a null value to it, otherwise it will cause error CS8625 - Cannot convert null literal to non-nullable reference type.

void DoSomething(string param, List<string>? optional = null)
{
   // Check if the parameter is null, if so create empty list
   optional ??= new();

   ...
} 
还给你自由 2024-12-04 20:57:10
    private void test(List<string> optional = null)
    {

    }

对于字符串而不是列表感到抱歉。
Null 在 4.0 上对我来说工作得很好,我使用的是 Visual Studio 2010

    private void test(List<string> optional = null)
    {

    }

sorry about the string instead of list.
Null works fine for me on 4.0, i am using visual studio 2010

别在捏我脸啦 2024-12-04 20:57:10

我喜欢这种方式,它比 ??= 更具可读性

if (param == null) param = new();

I like it this way, it is more readable then ??=

if (param == null) param = new();
一直在等你来 2024-12-04 20:57:10
private void test(params object[] params)
{

}
private void test(params object[] params)
{

}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文