gpt4 book ai didi

c# - 包装值扩展方法/运算符

转载 作者:行者123 更新时间:2023-11-30 15:30:15 24 4
gpt4 key购买 nike

假设我有通用值包装器:

class Wrapper<T>
{
public T Value { get; set; }
}

我想按照下面列出的方式使用它(或类似的东西):

var wrapper = new Wrapper<Target>();
// ...
Target target = wrapper;

如何使用隐式运算符、扩展方法或其他方法来提供单一位置空值检查?作为好处之一,我想将以下代码保留在一个地方:

if (wrapper != null)
{
return wrapper.Value;
}

return default(T);

编辑:

我试过运算符:

public static implicit operator T(Wrapper<T> wrapper)
{
return wrapper.Value ? default(T) : wrapper.Value;
}

我按照下面的方式完美工作:

var wrapper = new Wrapper<long>();
long value = wrapper;

但是失败了:

var wrapper = new Wrapper<IEnumerable<long>>();
IEnumerable<long> value = wrapper;

编译器说不可能从 Wrapper<IEnumerable<long>> 转换至 IEnumerable<long> .有什么想法吗?

最佳答案

您可以使用隐式运算符:

public static implicit operator T(Wrapper<T> value)
{
return value == null ? default(T) : value.Value;
}

编辑:

正如@ChrisSinclair 所指出的,当 T 是接口(interface)时,这是行不通的,唯一可以想到的解决方案是使用如下扩展方法:

public static T SafeGetValue<T>(this Wrapper<T> value)
{
return value == null ? default(T) : value.Value;
}

然后:

IEnumerable<long> value = wrapper.SafeGetValue();

关于c# - 包装值扩展方法/运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22454820/

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