gpt4 book ai didi

c# - 通用显式转换失败 C#

转载 作者:太空狗 更新时间:2023-10-29 20:03:18 24 4
gpt4 key购买 nike

我在处理以下代码时遇到了一些问题。我想将一个字符串显式化为一个对象,这工作得很好,但是,如果这个对象是泛型类的一部分,则会失败并出现以下错误异常:“无法转换类型为‘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;
}
}
}

如果有人能向我解释为什么这不正确,那就太棒了。

谢谢

最佳答案

转换运算符仅在类型静态已知时适用;毕竟,泛型方法需要为每个 T 使用完全相同的 IL - 因此它在某些情况下无法调用您的运算符,而在其他情况下则无法进行类型检查。

此外,因为您已经显式转换为object,所以它永远不会被使用; object 的转换总是一个简单的拆箱或类型检查。

一个邪恶的修复是(我不喜欢这样):

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

将解析推迟到运行时。它有效,但之后我需要洗眼。不过,更一般地说:运算符和泛型表现不佳 - 所以:尽量不要在您的 API 中使用该组合。我个人真的不会使用上面的内容!

关于c# - 通用显式转换失败 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11934134/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com