gpt4 book ai didi

c# - 无法通过引用转换、装箱转换、拆箱转换、包装转换或空类型转换将类型 'string' 转换为 'int?'

转载 作者:太空狗 更新时间:2023-10-29 18:07:12 26 4
gpt4 key购买 nike

C# 接受以下内容:

object o = "hello";
int? i = o as int?;

if (i == null) {
// o was not a boxed int
}
else {
// Can use i.Value to recover the original boxed value
}

但不是

String o = "hello";
int? i = o as int?;

if (i == null) {
// o was not a boxed int
}
else {
// Can use i.Value to recover the original boxed value
}

我只是想知道 C# 中关键字 as 的行为。

与在 Java 中一样,这会失败:

Object test1 = "hello";
Integer test2 = (Integer) test1;
String test3 = "hello";
Integer test4 = (Integer) test3; //compilation error

最佳答案

编译器知道字符串永远不可能是 int?,所以它会告诉您这一点。这并不意味着 int? 没有用。您尝试的用例与正常用例相去甚远。正常的是“我想表示一个整数以及该值丢失/未知的可能性”。为此,int? 工作得非常好。

为什么您期望您的原始代码能够工作?为什么会有帮助?

请注意,您可以as 与可空类型一起使用,以进行拆箱:

object o = "hello";
int? i = o as int?;

if (i == null)
{
// o was not a boxed int
}
else
{
// Can use i.Value to recover the original boxed value
}

编辑:看到你的评论后,你不使用 as 来解析东西。您可能想使用 int.TryParse :

string text = "123":
int value;
if (int.TryParse(text, out value))
{
Console.WriteLine("Parsed successfully: {0}", value);
}
else
{
Console.WriteLine("Unable to parse text as an integer");
}

如果您确定该字符串是一个整数(即它是一个错误),那么您可以只使用 int.Parse :

int value = int.Parse(text);

如果解析失败,将抛出异常。

另请注意,这两种方法都允许您指定格式提供程序(通常是文化信息),该格式提供程序允许您表达数字以该格式表示的方式(例如千位分隔符)。

编辑:在回答您的新问题时,编译器会阻止此操作,因为它知道字符串可能 不是装箱的 int - 转换永远不会成功。当它只知道原始值是一个对象时,它可能会成功。

例如,假设我对你说,“这是一个形状:它是正方形吗?”这是一个明智的问题。问之有理:不看形不分。

但是,如果我说:“这是一个三角形:它是正方形吗?”那么你就有理由当着我的面笑,因为三角形不可能是正方形 - 这个问题没有意义。

关于c# - 无法通过引用转换、装箱转换、拆箱转换、包装转换或空类型转换将类型 'string' 转换为 'int?',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/887943/

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