2013-02-15 74 views
4

例如操作结果铸造,为什么使用“为”铸造对象为null,与C#动态

比方说group.SupportedProducts为[“测试”,“你好”,“世界”]

var products = (string[]) group.SupportedProducts; 

结果正确地是一个字符串数组,它包含上述3个要素中的“产品” - “测试”,“你好”和“世界”

然而,

var products= group.SupportedProducts as string[]; 

结果产品为空。

+0

有趣的问题 – sehe 2013-02-15 23:16:21

+0

@zerkms这意味着你不同意第一条语句“作品”(我恨那个动词题) – 2013-02-15 23:16:51

+0

@Shmiddty数组是不是基本类型吧? – 2013-02-15 23:18:08

回答

9

想必group.SupportedProducts实际上一个string[],但它的东西,它支持自定义转换string[]

as从来没有调用自定义转换,而铸造。

样品展示这一点:

using System; 

class Foo 
{ 
    private readonly string name; 

    public Foo(string name) 
    { 
     this.name = name; 
    } 

    public static explicit operator string(Foo input) 
    { 
     return input.name; 
    } 
} 

class Test 
{ 
    static void Main() 
    { 
     dynamic foo = new Foo("name"); 
     Console.WriteLine("Casting: {0}", (string) foo); 
     Console.WriteLine("As: {0}", foo as string); 
    } 
} 
+0

哇。头脑风暴。我将所有用户定义的转换都放在了一起,因为OP说这是'动态'。我认为UDC从未被考虑过,除非在编译时(即不在通用设置中) – sehe 2013-02-15 23:25:59