gpt4 book ai didi

c# - 如何将可空类型隐式转换为不可空类型

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

我有一个可空的 c# 10 .net 6 项目,其扩展方法为 ThrowIfNull

using System;
using System.Runtime.CompilerServices;

#nullable enable
public static class NullExtensions
{
public static T ThrowIfNull<T>(
this T? argument,
string? message = default,
[CallerArgumentExpression("argument")] string? paramName = default
)
{
if (argument is null)
{
throw new ArgumentNullException(paramName, message);
}
else
{
return argument;
}
}
}

扩展方法将 string? 隐式转换为 string 但它不适用于其他基本类型,如 int?bool ?

public class Program
{
public static void Main()
{
Console.WriteLine("Hello World");

string? foo = "foo";
string nonNullableFoo = foo.ThrowIfNull(); // success from "string?" to "string"
Console.WriteLine(nonNullableFoo);

bool? baz = true;
bool nonNullableBaz = baz.ThrowIfNull(); // success from "string?" to "string"
Console.WriteLine(nonNullableFoo);

int? bar = 2;
int nonNullableBar = bar.ThrowIfNull(); // error: Cannot implicitly convert type 'int?' to 'int'
Console.WriteLine(nonNullableBar);
}
}

如何使扩展隐式转换 int?bool?

这是完整的 dotnet fiddle https://dotnetfiddle.net/LiQ8NL

最佳答案

您可以通过为不可为 null 的引用类型提供一种扩展方法和为非托管(例如 int、bool 等)类型提供另一种扩展方法来实现您的目标。请注意,非托管类型需要强制转换。

public static class NullExtensions
{
public static T ThrowIfNull<T>(
this T? argument,
string? message = default,
[CallerArgumentExpression("argument")] string? paramName = default
) where T : notnull
{
if (argument is null)
{
throw new ArgumentNullException(paramName, message);
}
else
{
return argument;
}
}

public static T ThrowIfNull<T>(
this T? argument,
string? message = default,
[CallerArgumentExpression("argument")] string? paramName = default
) where T : unmanaged
{
if (argument is null)
{
throw new ArgumentNullException(paramName, message);
}
else
{
return (T)argument;
}
}
}

像这样使用:

int? foo = 42;
int bar = foo.ThrowIfNull();
Console.WriteLine(bar);

string? baz = "Hello";
string quus = baz.ThrowIfNull();
Console.WriteLine(quus);

// Comment out either this
baz = null;
quus = baz.ThrowIfNull();
// Or this
foo = null;
bar = foo.ThrowIfNull();

关于c# - 如何将可空类型隐式转换为不可空类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70430422/

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