Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法转换类型';字符串';至';int?&x27;通过引用转换、装箱转换、取消装箱转换、换行转换或空类型转换_C#_Int_Type Conversion - Fatal编程技术网

C# 无法转换类型';字符串';至';int?&x27;通过引用转换、装箱转换、取消装箱转换、换行转换或空类型转换

C# 无法转换类型';字符串';至';int?&x27;通过引用转换、装箱转换、取消装箱转换、换行转换或空类型转换,c#,int,type-conversion,C#,Int,Type Conversion,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 b

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

智力?表示可为null的整数类型,而不是可以包含任何其他类型变量的int

如果您想要一个可以包含int或string的变量类型,那么您必须使用一个对象,或者我想是一个字符串,然后过一种充满类型转换的生活。我不知道你为什么要这么做


智力?允许您存储任何整数值或空值。如果说“此人下了多少订单”这个问题的答案是“我不知道”,而不是订单的数量,或者说是“我知道此人从未下过订单的事实”,那么这很有用。

但是您可以检查null的值并将其设置为null

int? blah;
if (blah == null)
{}

编译器知道字符串永远不能是
int?
,因此它告诉您这一点。这并不意味着
int?
没有用处。您尝试的用例与正常用例相差甚远。正常情况下,“我想表示一个整数,并且该值可能丢失/未知”。为此,
int?
非常有效

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

请注意,您可以将
作为
与可为空的类型一起使用,以便取消装箱:

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
来解析内容。您可能希望使用:

如果您确定字符串是一个整数(也就是说,它是一个bug),那么您可以使用:

如果解析失败,将引发异常

还请注意,这两种方法都允许您指定一个格式提供程序(通常是区域性信息),它允许您表示数字是如何以该格式表示的(例如,数千个分隔符)

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

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


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

int?是一个可为空的整数,它与强制转换和as关键字无关。“String”是字符串类型的对象,不能转换为int(可为null或不可为null)

as关键字实际上与使用方括号强制转换相同,只是它不会返回错误,它会将对象设置为null:

int i = 1;

object o = i; //boxing

int j = (int)o; //unboxing
第一个示例的作用是,分配给o的对象是int

现在考虑:

string i = "MyString";

object o = MyString;

 int j = (int)o //unboxing raises exception

 int j = o as int; //raises compilation Error as int is not nullable
 int? j = o as int?; /// o == null
我希望这有助于解释这两个概念之间的区别


理查德

我想补充一些进一步的信息

另一种情况是,System.String标记为sealed,这就是强制转换无效且编译器在编译时抛出错误的原因。因此编译器知道System.String从哪些类型继承,以及可以使用as运算符将字符串强制转换为哪些类型

由于关键字sealed,编译器还知道您无法从System.String继承来添加功能或实现一些附加接口

下面的代码是一个示例,编译器将在编译时抛出以下错误

无法将类型“SealedClass”转换为 通过引用的“ICastToInterface” 转换,拳击转换, 拆箱转换、包装 转换,或空类型转换


因为您正在尝试将字符串值分配给int。问号只允许int包含null值,它不会改变它是int的事实。Juan:您不使用强制转换或“as”在字符串和其他类型之间进行转换。没有隐式或显式转换可用-您必须使用解析方法。有关详细信息和示例,请参见我答案的后半部分。不,我从未期望转换运算符尝试进行解析。哎呀,看起来我误读了你编辑的问题,我以为它说你在试图找到一种方法来转换。不过,我会把这些额外的信息留给未来的读者。我也很乐意写它们:)不,我认为这很好-这是一个显式转换,所以你要告诉编译器“我认为在执行时这会很好”。这对我来说很有意义,你不能告诉编译器你认为某些东西会工作,而编译器肯定知道它不会。“int j=o as int”不会引发异常-它会阻止编译,因为在o不是装箱int的情况下,j没有取值。对不起,谢谢你的更正Jon。。。我已经相应地更新了答案。。。(希望正确)
int i = 1;

object o = i; //boxing

int j = (int)o; //unboxing
string i = "MyString";

object o = MyString;

 int j = (int)o //unboxing raises exception

 int j = o as int; //raises compilation Error as int is not nullable
 int? j = o as int?; /// o == null
public class UnsealedClass {
  // some code
}

public sealed class SealedClass {
  // some code
}

public interface ICastToInterface {
  // some code
}

public class Test {

  public Test() {
    UnsealedClass unsealedClass = new UnsealedClass();

    SealedClass sealedClass = new SealedClass();

    ICastToInterface unsealedCast = unsealedClass as ICastToInterface;  // This works fine

    ICastToInterface sealedCast = sealedClass as ICastToInterface; // This won´t compile, cause SealedClass is sealed
  }
}