我试图通过我编写的与Nullable<T> 非常相似的结构来实现这一点。使用Nullable<T>,您可以执行类似的操作
Nullable<Guid> id1 = null;
Guid id2 = id1 ?? Guid.NewGuid();
将id1 从Nullable<Guid> 隐式转换为Guid 没有问题,尽管Nullable<T> 只有defines an explicit conversion 才能键入T。用我自己的类型做同样的事情,它给出了一个错误
运算符'??'不能应用于“MyType”类型的操作数和
'指导'
所以我认为编译器内置了一些魔法,可以为Nullable<T> 设置一个特殊例外。所以作为一种选择......
tl;博士
我们不能覆盖 ?? 运算符,但是如果您希望合并运算符评估基础值而不是类(或在我的情况下为结构)本身,您可以只使用导致很少额外的方法需要击键。在我上面的案例中,它看起来像这样:
public struct MyType<T>
{
private bool _hasValue;
internal T _value;
public MyType(T value)
{
this._value = value;
this._hasValue = true;
}
public T Or(T altValue)
{
if (this._hasValue)
return this._value;
else
return altValue;
}
}
用法:
MyType<Guid> id1 = null;
Guid id2 = id1.Or(Guid.Empty);
这很好用,因为它是一个结构,id1 本身实际上不能为空。对于一个类,如果实例为空,只要您尝试检查的值是公开的,扩展方法就可以处理:
public class MyClass
{
public MyClass(string myValue)
{
MyValue = myValue;
}
public string MyValue { get; set; }
}
public static class MyClassExtensions
{
public static string Or(this MyClass myClass, string altVal)
{
if (myClass != null && myClass.MyValue != null)
return myClass.MyValue;
else
return altVal;
}
}
用法:
MyClass mc1 = new MyClass(null);
string requiredVal = mc1.Or("default"); //Instead of mc1 ?? "default";