[英]Why can't I use the as keyword for a struct?
我定义了以下结构:
public struct Call
{
public SourceFile caller;
public SourceFile callee;
public Call(SourceFile caller, SourceFile callee)
{
this.caller = caller;
this.callee = callee;
}
}
稍后,我将它分配给另一个对象的Tag属性:
line.Tag = new Call(sf1, sf2);
但是当我尝试像这样检索Tag属性时,
Call call = line.Tag as Call;
Visual Studio提供以下编译时错误:
必须在引用类型或可空类型中使用运算符
那是什么意思? 我该如何解决?
一些现有的答案并不完全正确。 您不能将非可空类型与as
,因为如果第一个操作数实际上不是合适的类型,则as
的结果是该类型的空值。
但是,您可以使用as
值类型...如果他们可为空:
int a = 10;
object o = a;
int? x = o as int?; // x is a Nullable<int> with value 10
long? y = o as long?; // y is a Nullable<long> with the null value
所以你可以使用:
Call? call = line.Tag as Call?;
然后你可以用它作为:
if (call != null)
{
// Do stuff with call.Value
}
但有两点需要注意:
is
后跟铸造 Call
类型:
我强烈建议你把它变成一个班级 - 无论如何这个问题都会消失。
另一个想法:如果标签应该始终是一个Call
,那么最好将其转换为:
Call call = (Call) line.Tag;
这样,如果数据与您的期望不符(即有一些错误,使得Tag
不是Call
),那么您可以尽早找到它,而不是在您可能完成其他工作之后。 请注意,根据Call
是一个结构还是一个类,如果Tag
为null,这个转换将表现不同 - 您可以将null值转换为引用类型的变量(或可空值类型),但不能转换为非可空值类型。
来自C#规范
§7.10.11as运算符用于将值显式转换为给定的引用类型或可空类型 。 与强制转换表达式(第7.7.6节)不同,as运算符从不抛出异常。 相反,如果无法指示转换,则结果值为空 。
引用和可空类型可以为null。 Stucts是值类型,因此它们不能为null。
Call? call = line.Tag as Call?;
这是C#的限制。 如果类型是引用类型,那么如果转换失败,它将只返回'null',但由于它是一个值类型,它不知道在转换失败时返回什么。
你必须将你的使用替换成两个:'是'和'as'
if (line.Tag is Call) {
call = (Call)line.Tag;
} else {
// Do whatever you would do if as returned null.
}
意义是什么 - 如上所述,结构是价值类型。
我该如何解决 - 将其更改为
Call call = line.Tag;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.