[英]C# generic return with generic type set in the method not in the call
我正在尝试建立一种从数据库中检索数据的方法,并根据其中的数据来创建具有通用组件的类并将其合并。
public class MyObject<T> where T : BaseMyType
{
T MyTypedObject { get; set; }
}
public class MyType1 : BaseMyType
{
string Key { get; set; }
}
public class MyType2 : BaseMyType
{
Guid Id { get; set; }
}
public MyObject<T> MyMethod<T>() where T : BaseMyType
{
if(Situation1)
return new MyObject(MyType1);
else
return new MyObject(MyType2);
}
此代码抱怨MyObject <MyType1>无法转换为MyObject <T>。 现在,我需要像这样使用它:
var myObject = MyMethod();
当然,电话抱怨它不能从用法中推断类型。 我了解编译器错误消息,但是我不确定该怎么做。
它无法完成,但是……让我们暂时考虑一下,我们可以为下面的语句找到所需的编译方式:
var myObject = MyMethod();
那么使用myObject
的代码是什么样的? 在这种假设的情况下,变量myObject
有时会具有类型MyType1
,有时会具有类型MyType2
。 使用myObject
的代码会关心吗?
如果所有代码将使用共享基本类型的成员(即BaseMyType
),则此修复很容易。 只需忘记通用方法即可:
public BaseMyType MyMethod()
{
if(Situation1)
return new MyType1();
else
return new MyType2();
}
如果它确实关心差异(即需要根据返回的类型访问Key
或Id
),那么即使您可以做不可能的事情,调用代码仍将需要根据条件有条件地处理各个方案。 Situation1
变量。 这将意味着你把支票Situation1
在错误的地方。
相反,您的呼叫者应该看起来像这样:
if (Situation1)
{
MyType1 myObject = MyMethod1();
// do situation 1 stuff
}
else
{
MyType2 myObject = MyMethod2();
// do situation 2 stuff
}
原始MyMethod()
的实现已分为两个方法,分别对应于两种情况的MyMethod1()
和MyMethod2()
。 再次注意,在实现中完全缺少泛型。 它不是必需的,并且不会起作用。
甚至有可能需要调用方的多态实现,即,这样就不必多次检查“ Situation1
1”。 但是如果没有一个好的, 最小的 , 完整的代码示例 ,就不可能对这种可能性进行更彻底的评论。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.