基本上,为什么以下内容在C#中无效?我可以找到很多好的用途,事实上可以通过创建自己的可空结构体类来修复它,但是为什么和如何C#规范(因此编译器)会阻止它?
以下是我所说的部分示例。
以下是我所说的部分示例。
struct MyNullable<T> where T : struct
{
public T Value;
public bool HasValue;
// Need to overide equals, as well as provide static implicit/explit cast operators
}
class Program
{
static void Main(string[] args)
{
// Compiles fine and works as expected
MyNullable<Double> NullableDoubleTest;
NullableDoubleTest.Value = 63.0;
// Also compiles fine and works as expected
MyNullable<MyNullable<Double>> NullableNullableTest;
NullableNullableTest.Value.Value = 63.0;
// Fails to compile...despite Nullable being a struct
// Error: The type 'double?' must be a non-nullable value type in order to use it as parameter 'T' in the generic type or method 'ConsoleApplication1.MyNullable<T>'
MyNullable<Nullable<Double>> MyNullableSuperStruct;
}
}
Nullable<T>
上的“magic”约束,该约束要求参数是非空值类型。 - Ben VoigtNullable<double?>
也不起作用。这是因为奇怪的变形行为,装箱转换将可空结构转换为 System.Nullable 类对象。这不符合您的约束条件。这也是您无法将可空类型用作约束的原因。 - Hans Passant