首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么一个可空的int不能隐式转换为int?技术原因还是设计选择?

为什么一个可空的int不能隐式转换为int?技术原因还是设计选择?
EN

Stack Overflow用户
提问于 2019-05-28 15:40:30
回答 3查看 420关注 0票数 2

在C#中,不存在从int?类型到int类型的隐式转换。

我定义了以下隐式运算符

代码语言:javascript
运行
复制
namespace System
{
    public partial struct Int32
    {
        public static implicit operator Int32(int? v)
        {
            return (Int32)(v ?? 0);
        }
    }
}

,它允许我编译以下代码

代码语言:javascript
运行
复制
int? nullableInt = 0;
Int32 regularInt = nullableInt;

但是,如果我将regularInt定义为int而不是Int32,则会得到以下错误

不能隐式转换类型'int?‘到“int”。存在显式转换(是否缺少强制转换?)

我原以为intInt32是可互换的,但是C#语言显然还没有考虑到这个功能。

定义此操作的不可能背后是否有技术原因,这是否是为了防止潜在的代码嗅探而作出的决定?

我知道,定义这样一个隐式运算符可能会导致一些非常意外的行为,因为从null值到0整数的转换并不是在每种情况下都有意义的。这个问题更多的是关于“为什么不能做”,而不是“为什么这么做是一个非常糟糕的想法”。

EN

Stack Overflow用户

发布于 2019-05-28 16:01:14

作为文档化的这里,只有保存转换,隐式类型转换才是可能的。

以前的例子

代码语言:javascript
运行
复制
// Implicit conversion. A long can
// hold any value an int can hold, and more!
int num = 2147483647; 
long bigNum = num;

在您的例子中,intInt32可能被保存为int?,但反之亦然。

这同样适用于类型层次结构。

代码语言:javascript
运行
复制
class A {}

class B : A {}

class C : A {}

A var1 = new A(); // Compiles
A var2 = new B(); // Compiles (implicit cast)
B var3 = new B(); // Compiles

// need for explicit cast because instance2 can could also be A or C
B var4 = (B) instance2;

// Throws InvalidCastException
C var5 = (C) instance2;
票数 -1
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56345723

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档