【发布时间】:2022-02-10 21:23:38
【问题描述】:
当 C# 将一个可为空的类型与“null”进行比较时,C# 编译器是否会先插入一些代码来检查变量是否有值?
int? fk2=null;
OtherNullable<int> fk3=null;
Console.WriteLine(fk2 == null);
Console.WriteLine(fk3 == null);
上下文,我正在尝试计算等式 + 隐式和显式转换应该是什么样的,以启用 fk3 和 null 的比较。
假设您按照此处发布的代码实现了 Nullable:How does a Nullable<T> type work behind the scenes? 并将其命名为 OtherNullable<T>
只需稍加修改即可正常工作,只是 val == null 在运行时不起作用。
实施:
[Serializable, StructLayout(LayoutKind.Sequential)]
public struct OtherNullable<T> : IEquatable<OtherNullable<T>> where T : struct {
private bool hasValue;
internal T value;
public OtherNullable(T value)
: this() {
this.value = value;
this.hasValue = true;
}
public OtherNullable(T? value) {
this.value = default(T);
this.hasValue = false;
}
public bool HasValue {
get { return this.hasValue; }
}
public T Value {
get {
if (!this.HasValue) {
throw new InvalidOperationException("No Value");
}
return this.value;
}
}
public OtherNullable(bool b) {
this.value = default(T);
this.hasValue = false;
}
public T GetValueOrDefault() {
return this.value;
}
public T GetValueOrDefault(T defaultValue) {
if (!this.HasValue) {
return defaultValue;
}
return this.value;
}
public bool Equals(OtherNullable<T> other)
{
if (!other.HasValue & !this.HasValue)
return true;
else
return other.hasValue.Equals(hasValue) && other.value.Equals(value);
}
public static bool operator ==(OtherNullable<T> left, OtherNullable<T> right) {
return left.Equals(right);
}
public static bool operator !=(OtherNullable<T> left, OtherNullable<T> right) {
return !left.Equals(right);
}
public override bool Equals(object other) {
if (ReferenceEquals(null, other)) return false;
if (other.GetType() != typeof(OtherNullable<T>)) return false;
return Equals((OtherNullable<T>)other);
}
public override int GetHashCode() {
unchecked {
return (hasValue.GetHashCode() * 397) ^ value.GetHashCode();
}
}
public override string ToString() {
if (!this.HasValue) {
return "";
}
return this.value.ToString();
}
public static implicit operator OtherNullable<T>(T value) {
return new OtherNullable<T>(value);
}
public static explicit operator T(OtherNullable<T> value) {
return value.Value;
}
public static implicit operator OtherNullable<T>(Nullable<T> value) {
if (value.HasValue) {
return new OtherNullable<T>(value.Value);
} else {
return new OtherNullable<T>(null);
}
}
}
测试代码(不会编译——以前是这样):
[TestFixture]
public class TestOtherNullable {
[Test]
public void Test()
{
var a = new OtherNullable<int>();
a = 1;
Assert.IsTrue(a.HasValue);
Assert.IsFalse(a == null);
var b = new OtherNullable<int>();
b = null;
Assert.IsTrue(b == null);
}
}
【问题讨论】:
标签: c#