在浏览一些教程时,我遇到了这样的行:
((IDisposable)foo).Dispose();
忽略对 Idisposable 的具体引用。我很好奇为什么括号的设置方式以及它们包含/做什么。我确信这是一个非常简单的问题,但是由于这种语法的泛型,我一直无法通过搜索找到答案。非常感谢您的帮助,谢谢。
在浏览一些教程时,我遇到了这样的行:
((IDisposable)foo).Dispose();
忽略对 Idisposable 的具体引用。我很好奇为什么括号的设置方式以及它们包含/做什么。我确信这是一个非常简单的问题,但是由于这种语法的泛型,我一直无法通过搜索找到答案。非常感谢您的帮助,谢谢。
第一组括号将其强制转换为 IDisposable 对象。例如
Object foo = new Object();
IDisposable ID;
现在ID = foo
会给出一个错误,但ID = (IDisposable)foo
会起作用。
第二组括号允许您访问 IDisposable 对象的方法和属性,在本例中为 Dispose() 方法。如果您输入它,您将看到只有在您将第二组括号括起来后,智能感知才会向您显示 IDisposable 对象的方法和属性。
语法:
var d = (IDisposable)foo;
称为显式强制转换。
语法:
((IDisposable)foo).Dispose();
显式转换foo
为临时变量并Dispose
对其进行调用(请注意,此处使用了临时变量但您看不到它,它是由编译器创建的)。
括号告诉编译器操作的优先顺序。IDisposable
在这种情况下,它表示在解析Dispose
调用之前将变量转换为。因为之前已经完成,所以编译器现在知道解析Dispose
类型为 的变量IDisposable
。
您可以以其他形式看到此行为:
(foo as IDisposable).Dispose();
或者:
string s = null;
while ((s = Console.ReadLine()) != null)
{
}
我的第一个示例as
以与您自己的演员(内联)相同的方式使用运算符进行转换。我的第二个示例s
在继续针对null
.
我的观点是,如果不使用括号来定义边界,这些都不会编译。
foo
(IDisposable)
以将其转换为请求的接口foo
是要转换的东西,而不是结果foo.Dispose()
.Dispose()
地址接口的一个方法这只是转换为 IDisposable 时的一个捷径。
这个...
((IDisposable)foo).Dispose();
和这个是一样的……
IDisposable i = (IDisposable)foo;
i.Dispose();
内部的括号IDisposable
将其转换为强制转换,然后外部的括号确保强制转换发生在对 的调用之前Dispose()
。