c# - 尝试利用通用参数的组合

标签 c# .net generics

这很令人困惑,因为我遇到了看似矛盾的错误。

我正在使用泛型,约束 TSomething , 然后约束 UAnOperation<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/

相关文章:

c# - 如何将 post 请求从 Android 发送到 C# web API

delphi - 'E2250 : There is no overloaded version of. ..' 错误类型的通用标识符

java通用可比较习语

generics - 实例化通用类型

c# - 当前上下文中不存在名称 'ConfigureAuth'

c# - 重构 LINQ 函数

c# - 如何捕获 'end of paper roll' 事件?

c# - 为什么Windows.Forms.Timer的时间间隔随着tick的增加而减少?

c# - 有没有办法在不抛出异常的情况下等待 TPL 任务?

c# - 如何使用 AfterMap 将属性映射到集合属性