Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将非泛型类型强制转换为泛型类型_C#_Generics - Fatal编程技术网

C# 将非泛型类型强制转换为泛型类型

C# 将非泛型类型强制转换为泛型类型,c#,generics,C#,Generics,我有一门课: class Foo { public string Name { get; set; } } 这个班呢 class Foo<T> : Foo { public T Data { get; set; } } 类Foo:Foo{ 公共T数据{get;set;} } 以下是我想做的: public Foo<T> GetSome() { Foo foo = GetFoo(); Foo<T> foot = (Foo

我有一门课:

class Foo { 
    public string Name { get; set; }
}
这个班呢

class Foo<T> : Foo {
    public T Data { get; set; }
}
类Foo:Foo{
公共T数据{get;set;}
}
以下是我想做的:

public Foo<T> GetSome() {
    Foo foo = GetFoo();

    Foo<T> foot = (Foo<T>)foo;
    foot.Data = GetData<T>();
    return foot;
}
publicfoogetsome(){
Foo-Foo=GetFoo();
Foo foot=(Foo)Foo;
foot.Data=GetData();
返回脚;
}

将Foo转换为Foo的最简单方法是什么?我不能直接强制转换InvalidCastException),如果不需要,我也不想手动复制每个属性(在我的实际用例中,有多个属性)。用户定义的类型转换是正确的吗?

如果您得到的是
InvalidCastException
,则
GetFoo()
返回的
Foo
类型不是
Foo
。您需要将
T
typeof(T)
传递给该函数,以便它可以返回
Foo

的实例。您可以在
Foo
中从Foo创建显式转换

类程序
{
静态void Main()
{
Foo-Foo=新的Foo();
foo.Name=“诸如此类”;
Foo newfoo=(Foo)Foo;
Console.WriteLine(newfoo.Name);
Console.Read();
}
}
福班
{
公共字符串名称{get;set;}
公共对象数据{get;set;}
}
福班
{
公共字符串名称{get;set;}
公共T数据{get;set;}
公共静态显式运算符Foo(Foo-Foo)
{
Foo newfoo=新Foo();
newfoo.Name=foo.Name;
返回newfoo;
}
}
编辑:这只在没有继承的情况下有效。您似乎无法执行从基类到派生类的用户定义转换。请参见Mads Torgersen的评论:

我们冒昧地 预定义转换(强制转换) 在基类和派生类之间 类,并使 语言是我们不知道的 让你来捣乱


看起来您可能需要定义一种方法来将Foo转换为
Foo
。否则就放弃继承权。这两种解决方案听起来都不太理想。

使用复制构造函数。Foo实现:

class Foo {
     Foo(Foo copy) { ... }
}
而Foo应使用以下材料建造:

class Bar<T> : Foo {
      Bar(Foo copy) : base(copy) { ... }
}
类栏:Foo{
Bar(Foo-copy):基(copy){…}
}

……是的。您需要一个成员一个成员地复制,这应该在“复制构造函数”中完成。

GetFoo看起来像什么?它只是一个存根。用新的Foo()替换它;如果是这样,那么你就有一个根本性的问题。类型不能变成其他类型。只是一个简单的问题:如果您创建了一个简单的
Foo
对象,您将如何将其强制转换为
Foo
?它应该从哪里获得额外的
数据
?想知道如果我让Foo和Foo都从一个具有共享属性的抽象基类FooBase继承,这是否会更容易……强制转换异常位于
Foo foot=(Foo)Foo行,而不是从GetFoo()返回;这只是一个证明结构的存根。我的观点仍然站得住脚。看看问题是从哪里来的,而不是发生在哪里。但它并没有回答更大的问题。我已经知道演员阵容是不可能的,这只是我意图的证明。@John Sheehan:那么看看我回答中的第二句话。还有其他选项,比如将
Foo
的新实例传递到
GetFoo
方法中以填充它。如果不是这样,请澄清您的问题。:)或者让
GetFoo
generic:
foogetfoo()
OK这就是我的想法。只是寻找验证:)ThanksThis不起作用:“用户定义的基类之间的转换是不允许的”@John Sheehan:他的例子可以,但如果你有继承的话就不行了。有趣的是,我没有注意到继承。我的例子没有它也行。回到绘图板上。一个好主意。。。我没有意识到这一点。。。谢谢你让我不断学习(+1)
class Bar<T> : Foo {
      Bar(Foo copy) : base(copy) { ... }
}