Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.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,我有以下代码可以工作,但我认为它可能不是最优的,因为理论上编译器可以从调用的子类确定泛型类型。是否有方法重写此代码,使我不需要提供ChildType泛型类型参数 public abstract class Test<ChildType, T> where ChildType: Test<ChildType, T>, new() { public T Field { get; set; } public static ChildType Get(T fie

我有以下代码可以工作,但我认为它可能不是最优的,因为理论上编译器可以从调用的子类确定泛型类型。是否有方法重写此代码,使我不需要提供
ChildType
泛型类型参数

public abstract class Test<ChildType, T> where ChildType: Test<ChildType, T>, new()
{
    public T Field { get; set; }

    public static ChildType Get(T field) {
        return new ChildType() { Field = field };
    }
}

public class ChildTest: Test<ChildTest, string>
{
}

// Call sample
var child = ChildTest.Get("test");
公共抽象类测试,其中ChildType:Test,new()
{
公共T字段{get;set;}
公共静态子类型Get(T字段){
返回新的ChildType(){Field=Field};
}
}
公共类儿童测试:测试
{
}
//呼叫样本
var child=ChildTest.Get(“test”);

答案是,
测试
类需要指定
儿童类型
泛型类型。您可以使用反射来获取当前类型并实例化其实例,但通常最好避免反射

看为什么要考虑<>代码>测试> /Cuth>类本身,特别是这行:

return new ChildType() { Field = field };
该行需要两条信息。首先,它需要知道
ChildType
的实际类型是什么。您不能硬编码它,因为它当然可以变化。它需要的第二条信息是知道它可以通过这种方式创建这种类型的新对象


这两条信息都是通过泛型类型参数和泛型约束提供的,这就是为什么需要它。

答案是
Test
类需要指定
ChildType
泛型类型。您可以使用反射来获取当前类型并实例化其实例,但通常最好避免反射

看为什么要考虑<>代码>测试> /Cuth>类本身,特别是这行:

return new ChildType() { Field = field };
该行需要两条信息。首先,它需要知道
ChildType
的实际类型是什么。您不能硬编码它,因为它当然可以变化。它需要的第二条信息是知道它可以通过这种方式创建这种类型的新对象



这两条信息都是通过泛型类型参数和泛型约束提供的,这就是为什么需要它的原因。

您的问题到底是什么?我认为原样的代码不起作用,因为
Get
方法的调用类似于静态方法,但它是一个实例方法。我仍然不清楚您想要什么。您是说您希望能够仅使用
T
type参数声明
Test
?如果是这样,简单的答案是否定的,因为它需要知道它正在创建的类。如果你的问题是其他的,那么请澄清你想尝试做什么(可能是用一些你想写的伪代码)…我编辑了这个问题,希望能让它更清楚。你能证实我没有改变你问题的意图吗?@Chris,谢谢!你的问题到底是什么?我认为原样的代码不起作用,因为
Get
方法的调用类似于静态方法,但它是一个实例方法。我仍然不清楚你想要什么。您是说您希望能够仅使用
T
type参数声明
Test
?如果是这样,简单的答案是否定的,因为它需要知道它正在创建的类。如果你的问题是其他的,那么请澄清你想尝试做什么(可能是用一些你想写的伪代码)…我编辑了这个问题,希望能让它更清楚。你能证实我没有改变你问题的意图吗?@Chris,谢谢!还需要注意的是,在为抽象类声明泛型类型时,最好使用TChildType、TFieldType表示法intead ChildType和T。因为ChildType指的是一个类(大多数情况下人们会这么理解),而不是泛型类型。非常感谢您的解释!我真的很高兴至少有人能理解我),因为我不太懂C,并努力提高我的技能来编写好代码。@Chris true,TChildType声明了两次类型;)=)我也是。只是我应该提高我的英语水平。@Баааа:你的英语比我所说的任何其他语言都好还需要注意的是,在为抽象类声明泛型类型时,最好使用TChildType、TFieldType表示法intead ChildType和T。因为ChildType指的是一个类(大多数情况下人们会这么理解),而不是泛型类型。非常感谢您的解释!我真的很高兴至少有人能理解我),因为我不太懂C,并努力提高我的技能来编写好代码。@Chris true,TChildType声明了两次类型;)=)我也是。只是我应该提高我的英语水平。@Баааа:你的英语比我所说的任何其他语言都好