【发布时间】:2019-12-16 12:09:30
【问题描述】:
我有一个简单的类,看起来像这样:
public class MyClass<T>
{
public int Status { get; set; }
public T Value { get; set; }
}
为方便起见,我有另一个继承自MyClass<string> 的类,以允许我在没有泛型参数的情况下构造MyClass,例如:
public class MyClass : MyClass<string> { }
我希望能够将MyClass<T> 转换为MyClass,默认情况下这似乎不起作用。此示例转换引发以下错误:
MyClass<string> withT = new MyClass<string> { Status = 1, Value = "Somevalue" };
MyClass withoutT = (MyClass)withT;
无法将“MyClass`1[System.String]”类型的对象转换为“MyClass”
所以我认为我需要实现一些隐式/显式转换逻辑,如this answer. 中所述
我已将MyClass<T> 更新如下,但仍然抛出相同的错误:
public class MyClass<T>
{
public int Status { get; set; }
public T Value;
public static implicit operator MyClass(MyClass<T> myClass)
{
return new MyClass
{
Status = myClass.Status,
Value = myClass.Value.GetType() == typeof(string) ? myClass.Value.ToString() : null
};
}
}
谁能帮忙指出我哪里出错了?
【问题讨论】:
-
您已经创建了
MyClass<string>的实例。这不是MyClass的实例。这就像尝试做的那样:object x = new object(); string y = (string) x;. -
如何定义非泛型
MyClass? -
每个
MyClass都是MyClass<string>,但不是每个MyClass<string>都是MyClass。 -
就转换失败的原因而言 - 通常您根本无法在类型层次结构中定义转换,但我相信泛型有效地隐藏了问题 - 因为如果您尝试从
MyClass<int>到MyClass然后它会工作。但我建议完全重新考虑您的MyClass非泛型类型。如果这真的只是“我想构造一个MyClass<string>而不必指定类型参数”的问题,则使用别名更有可能有用。 -
请注意,转换会给您带来相当意外的行为,因为您将创建一个新的独立实例 - 而读者可能会期望它只是一个简单的转换,保留对象身份。跨度>