首页 > 解决方案 > 演员班上课

问题描述

我有一个简单的类,看起来像这样:

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
        };
    }
}

谁能帮忙指出我哪里出错了?

标签: c#genericscasting

解决方案


为什么不使用工厂?这是一个非常简单的例子:

public static class MyClass
{
    public static MyClass<string> Create(string s, int status)
    {
        return new MyClass<string>(s, status);
    }
}

...

var x = MyClass.Create("Foo", 0);

推荐阅读