【发布时间】:2018-10-27 12:27:39
【问题描述】:
这是一种我无法理解的奇怪行为。在我的示例中,我有一个类Sample<T> 和一个从T 到Sample<T> 的隐式转换运算符。
private class Sample<T>
{
public readonly T Value;
public Sample(T value)
{
Value = value;
}
public static implicit operator Sample<T>(T value) => new Sample<T>(value);
}
当为T 使用可空值类型(例如int?)时会出现问题。
{
int? a = 3;
Sample<int> sampleA = a;
}
这里是关键部分:
在我看来,这不应该编译,因为Sample<int> 定义了从int 到Sample<int> 的转换,但不是从int? 到Sample<int>。 但它编译并运行成功!(我的意思是调用转换运算符并将3 分配给readonly 字段。)
而且情况变得更糟。这里没有调用转换运算符,sampleB 将被设置为null:
{
int? b = null;
Sample<int> sampleB = b;
}
一个很好的答案可能会分为两部分:
- 为什么第一个sn-p中的代码会编译?
- 我可以阻止代码在这种情况下编译吗?
【问题讨论】:
-
Here there is the documentation about C# conversions... 但我找不到哪个项目符号点在这里发生的事情。
标签: c# generics nullable implicit-conversion value-type