通用显式类型转换失败C#(Generic explicit cast failure C#)

2019-09-21 03:38发布

我已经用下面这段代码的一些问题。 我想明确的字符串到一个对象,这是工作完全正常,但是,如果这个对象是一个通用类的一部分,这是与以下错误异常失败:“无法投类型的对象‘System.String’键入“test.B””。 尽管我已经超载的方法。

using System;
using System.Collections.Generic;

namespace test {
    class Program {
        static void Main(string [] args) {
            // These two cast perfectly fine.
            B x = (B) "abc";
            C y = (C) "def";

            A <B> a = new A<B>();
            a.b();
            A <C> b = new A<C>();
            b.b();
        }
    }

    class A<T> {
        public List <T> a = new List<T>();

        public void b() {
            // Unable to cast object of type 'System.String' to type 'test.B'
            this.a.Add ((T) (object) "abc"); 
            this.a.Add ((T) (object) "def");
            this.a.Add ((T) (object) "ghi");
        }
    }

    class B {
        public string b;

        public static explicit operator B(string a) {
            B x = new B();
            x.b = a;
            return x;
        }
    }

    class C {
        public string c;

        public static explicit operator C(string a) {
            C x = new C();
            x.c = a;
            return x;
        }
    }
}

这将是真棒,如果有人为能来我这是为什么不投正确解释。

谢谢

Answer 1:

当类型是静态已知的转换运算符仅适用; 毕竟,通用的方法,需要使用完全相同的IL每一个T -所以它不能调用在某些情况下,您的运营商,而在其他类型的检查。

此外,因为你已经明确地转换为object ,它永远不会被使用; 从铸造object 始终是一个简单的拆箱或类型检查。

一个邪恶的解决将是(我不喜欢这样的):

        this.a.Add((T)(dynamic)"abc");
        this.a.Add((T)(dynamic)"def");
        this.a.Add((T)(dynamic)"ghi");

会推迟分辨率运行时。 它的工作原理,但我需要后洗我的眼睛。 更一般地,虽然:运营商和仿制药没有发挥很好 -所以:尽量不要用你的API在该组合。 我真的不使用上面,个人!



Answer 2:

编译器已经在如果泛型参数有您使用显式类型转换编译时没有知识。

你可以尽管引入接口,并把约束泛型参数



Answer 3:

其因为TA<T>不知道关于所述显式转换运营商BC



Answer 4:

插入的(对象)铸,让编译器停止告诉你,你做错了。 这工作,编译器可以不再抱怨,因为从能够检查各类停止它。 而从对象投至T可能实际工作,小的几率可能。

什么,你却没有算的上是显式转换运算符是一个C#语言的功能。 只有编译器知道当施加这样的投什么方法来执行。 这不是一个CLR功能,运行时不会去打猎和采集,试图找到一个适用的方法来进行转换。 C#编译器是无能为力的,否则使用任何你在编译时提供的运营商,它不知道T的类型

麻烦的是,编译器不再是围绕以帮助剧组执行时。 KABOOM。

有在运行时,而不是编译时应用泛型是一个.NET功能,通用的术语是“物化仿制药”。 相对于“类型擦除”,仿制药的方式在Java和C ++实现。 与类型消除麻烦的是,对泛型类型参数的所有信息都将丢失代码进行编译后,泛型类型不能被另一种语言的使用与思考不起作用。 与具体化泛型麻烦的是,不能普遍适用于任何类型的操作可以不被使用。 Like运算符+()。 而像这样的演员。



文章来源: Generic explicit cast failure C#