这很令人困惑,因为我遇到了看似矛盾的错误。
我正在使用泛型,约束 T
至 Something
, 然后约束 U
至 AnOperation<Something>
.
我期望一个对象 AnOperation<Something>
从现在开始考虑类型 U
.但是,我遇到了错误:
Cannot implicitly convert type 'ConsoleApp1.AnOperation<T>' to 'U'
这很奇怪。好吧,我尝试将其显式转换为 U,然后出现此错误:
Cannot convert type 'ConsoleApp1.AnOperation<T>' to 'U'
其中还说明了 Cast is redundant
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
}
}
class MyClass<T, U>
where T : Something
where U : AnOperation<Something>
{
public U GetAnOperationOfSomething()
{
AnOperation<T> anOperation = new AnOperation<T>();
return anOperation; // Cannot implicitly convert type 'ConsoleApp1.AnOperation<T>' to 'U'
// return (U)anOperation; // Cannot convert type 'ConsoleApp1.AnOperation<T>' to 'U' also Cast is redundant
}
}
public class Something
{
}
public class AnOperation<T>
where T : Something
{
}
}
这里发生了什么?
编辑:我试图了解语言级别的问题是什么,而不是寻找解决实际问题的方法。
最佳答案
您几乎完全符合您的约束条件,但不完全正确。你定义
where U : AnOperation<Something>
然后你创造
AnOperation<T> anOperation = new AnOperation<T>()
这不是一回事。如果您将约束更改为...
where U : AnOperation<T>
……你会没事的。
另一个问题是,虽然每个 U
是一个 AnOperation<T>
, 不是每个 AnOperation<T>
是一个 U
.当你声明...
public U GetAnOperationOfSomething()
...您保证该方法返回的是 U
. AnOperation<T>
无法满足该保证。
您正在通过类型转换为 U
来解决此问题.这违背了通用类的目的,因为每个 U
必须是 AnOperation<T>
否则你会得到一个运行时异常。这使得整个类型参数 U
不必要。您实际上想要做的是创建一个 U
.您可以使用 new()
对此的约束:
class MyClass<T, U>
where T : Something
where U : AnOperation<T>, new()
{
public U GetAnOperationOfSomething()
{
U anOperation = new U();
//...
return anOperation;
}
}
new()
约束保证 U
将有一个公共(public)默认构造函数,您可以调用它。
关于c# - 尝试利用通用参数的组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46884016/