首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >强制转换为接口类型时未调用DynamicObject.TryConvert

强制转换为接口类型时未调用DynamicObject.TryConvert
EN

Stack Overflow用户
提问于 2010-08-16 20:11:04
回答 1查看 5.1K关注 0票数 21

下面的代码引发异常。没有为转换接口调用TryConvert。为什么会这样呢?我能解决这个问题吗?

代码语言:javascript
复制
using System.Dynamic;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            dynamic test = new JsonNull();
            var ok = (string)test;
            // Next line throws:
            // Unable to cast object of type 'ConsoleApplication1.JsonNull' to type 'ConsoleApplication1.IFoo'.
            var fail = (IFoo)test;
        }
    }

    class JsonNull : DynamicObject
    {
        public override bool TryConvert(ConvertBinder binder, out object result)
        {
            result = null;
            return !binder.Type.IsValueType;
        }
    }

    interface IFoo { }
}
EN

回答 1

Stack Overflow用户

发布于 2011-01-25 05:31:12

我发现如果你改变这一行:

代码语言:javascript
复制
var fail = (IFoo)test; 

要这样做:

代码语言:javascript
复制
IFoo success = test;

它的工作方式与预期一致。

在这种情况下,似乎只有隐式转换有效。在我看来像是个虫子。

我还发现这也失败了,这是非常恼人的:

代码语言:javascript
复制
class Program {
  static void Main(string[] args) {
    dynamic test = new JsonNull();
    Fails(test);
  }
  static void Fails(IFoo ifoo) { }
}
// ...

因为它看起来也应该使用隐式转换。又是一个bug?

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3492955

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档