Dispose方法不允许对象参与C#中的使用。为什么?
根据通过C#CLR:
如果将动态表达式指定为foreach语句中的集合或指定为using语句,编译器将生成尝试将表达式强制转换为非通用System.IEnumerable接口或System.IDisposable接口。如果强制转换成功,则使用表达式,并且代码可以正常运行。如果强制转换失败,Microsoft.CSharp.RuntimeBinder.RuntimeBinderException异常被抛出。
因此,我正在尝试以下操作:
using System;
namespace myprogram
{
delegate void VoidRes();
class Program
{
static void Main(string[] args)
{
dynamic a = new
{
Dispose = new VoidRes
(
delegate () { Console.WriteLine("in Dispose"); }
)
};
using(a) {
Console.WriteLine("foo");
}
}
}
}
我收到一个错误:
未处理的异常。 Microsoft.CSharp.RuntimeBinder.RuntimeBinderException:无法将类型“ <> f__AnonymousType4”隐式转换为“ System.IDisposable”在CallSite.Target(Closure,CallSite,Object)在System.Dynamic.UpdateDelegates.UpdateAndExecute1 [T0,TRet](CallSite网站,T0 arg0)
这很奇怪,因为我认为为了满足IDisposable
接口,就可以实现Dispose
方法(正是我在匿名类型中所做的事情。)。
我在这里想念什么?
足以实现IDisposable
,但是它并没有在代码中的任何地方发生。通过创建类/结构并显式指示接口类型,可以完成C#中的接口实现。一个对象具有相同的成员(属性,方法等)来匹配接口是不够的。 (这种行为称为鸭子输入,并且以其他一些语言存在。)
您的匿名类型不实现IDisposable
接口,只是因为它具有IDisposable
接口所具有的方法。匿名类型cannot