为什么c#null可以隐式转换为System.Nullable ,但不能自定义Nullable

为什么null可以像这样隐式转换为System.Nullable

 int? val = null; 

但是自定义的Nullable (从.net引用源修改)不能赋值null ,是否有一些编译魔术? 谁能告诉我更多的内部暗示?

 [Serializable] public struct Nullable where T : struct { private bool hasValue; internal T value; public Nullable(T value) { this.value = value; this.hasValue = true; } public bool HasValue { get { return hasValue; } } public T Value { get { if (!HasValue) { throw new Exception(); } return value; } } public T GetValueOrDefault() { return value; } public T GetValueOrDefault(T defaultValue) { return HasValue ? value : defaultValue; } public override bool Equals(object other) { if (!HasValue) return other == null; if (other == null) return false; return value.Equals(other); } public override int GetHashCode() { return HasValue ? value.GetHashCode() : 0; } public override string ToString() { return HasValue ? value.ToString() : ""; } public static implicit operator Nullable(T value) { return new Nullable(value); } public static explicit operator T(Nullable value) { return value.Value; } } 

下面测试代码,编译错误

 Nullable x = null; //ERROR Cannot convert null to 'Nullable' because it is a non-nullable value type 

C#5.0规范的6.1.5节:

6.1.5空文字转换
存在从null文字到任何可空类型的隐式转换。 此转换生成给定可空类型的空值(第4.1.10节)。

请注意,此编译器提供的隐式转换仅存在于可空类型中 。 您的自定义Nullable不是C#规范定义的可空类型。 它只是你声明的一些结构体,它具有内置Nullable类型的许多特性(在引用的4.1.10节中描述),但根据定义,它实际上并不是“可空的”。 C#。