gpt4 book ai didi

c# - 如果没有可空 DateTime 的隐式运算符,为什么 C# 隐式转换为可空 DateTime?

转载 作者:可可西里 更新时间:2023-11-01 08:20:02 24 4
gpt4 key购买 nike

这是一个关于 C# 语言或至少该语言在 Visual Studio 中是如何实现的问题。

假设有一个 Foo 类,它为 System.DateTime 定义了一个隐式运算符

public static implicit operator DateTime(Foo item)

考虑以下代码:

Foo foo = SomeMethodWhichCanReturnNull();    
DateTime? dtFoo = foo;

我的期望:编译失败提示没有从 FooDateTime? 的转换。

我的发现:编译器实际上调用了从 FooDateTime 的已定义隐式运算符,并在传递 null(它是转换器可以响应 null 的唯一方式)。

当然,work-around就是定义

public static implicit operator DateTime?(Foo item)

但为什么我必须这样做? DateTimeDateTime? 不是两种不同的类型吗?

最佳答案

首先,C# 语言规范说明内置隐式转换可以插入到用户定义的隐式转换的任一侧。因此,如果您有一个从 ShapeGiraffe 的用户定义隐式转换,那么您将自动允许从 Square 转换为 Mammal,因为它是 Square --> Shape --> Giraffe --> Mammal。在您的情况下,额外的转换仅插入一侧,假定操作数的类型为 Foo。存在从任何类型到其对应的可空类型的隐式转换。永远不会插入第二个用户定义转换;只能在任一侧插入内置转换。

(我注意到用户定义的显式转换也是如此;显式转换可以插入任何一侧。)

第二,你违反了规范,它强烈建议用户定义的隐式转换永远不应该抛出异常。如果您不能保证操作会成功,则要么更改类型,要么使其成为显式转换。

第三,您可能有兴趣知道,如果用户定义的隐式转换中的两种类型都是不可为 null 的值类型,C# 编译器将自动定义“提升”转换。如果你有一个用户定义的从结构类型 S 到结构类型 T 的隐式转换,那么你会从 S 得到一个“提升”的转换?到 T?免费,具有 s.HasValue 的语义?新 T?((T)s.Value) : 新 T?()

这个主题是 C# 规范中比较复杂的领域之一,所以如果您想了解确切的细节,我建议您仔细阅读它。

关于c# - 如果没有可空 DateTime 的隐式运算符,为什么 C# 隐式转换为可空 DateTime?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16862444/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com