C# 将“块”与“动态”一起使用
如果我写C# 将“块”与“动态”一起使用,c#,dynamic,using,C#,Dynamic,Using,如果我写 using (dynamic d = getSomeD ()) { // ... } 这是否意味着在保留using块时调用d.Dispose 当d没有实现IDisposable时会发生什么 这是否意味着在调用using块时调用d.Dispose 左 对。如果该类型实现IDisposable,则将调用Dispose 当d没有实现IDisposable时会发生什么 你会得到一个例外 类型的未处理异常 中出现“Microsoft.CSharp.RuntimeBinder.Runtim
using (dynamic d = getSomeD ()) {
// ...
}
这是否意味着在保留using块时调用d.Dispose
当d没有实现IDisposable时会发生什么
这是否意味着在调用using块时调用d.Dispose
左
对。如果该类型实现IDisposable,则将调用Dispose
当d没有实现IDisposable时会发生什么
你会得到一个例外
类型的未处理异常
中出现“Microsoft.CSharp.RuntimeBinder.RuntimeBinderException”
System.Core.dll
无法将类型“YourType”隐式转换为“System.IDisposable”。一
存在显式转换。是否缺少强制转换
您可以通过以下课程自己尝试:
class MyDisposable : IDisposable //Remove IDisposable to see the exception
{
public void Dispose()
{
Console.WriteLine("Dispose called");
}
}
然后:
using (dynamic d = new MyDisposable())
{
}
RuntimeBinderException就是这样发生的。有没有什么原因让你不能亲自尝试回答这两个问题?或者是尝试这种行为的好方法。以下是我在.NET上的尝试:@Jon:是的,尝试的结果不如知道答案的人的答案可靠。特别是在处理动态时。为了展示研究成果,您应该IMO至少自己尝试过它们-然后记录结果,并要求确认这是保证/指定的行为,IMO。如果任何人对动态引擎盖下发生的事情感到好奇,代码将编译到LINQPad targeting.NET 4中。下面是IL的外观:同样要添加,使用将转换为try/finally块。