gpt4 book ai didi

c# - 为什么非无参数构造函数仍然可以?

转载 作者:太空宇宙 更新时间:2023-11-03 17:13:16 24 4
gpt4 key购买 nike

这里是接口(interface)定义指定它必须使用无参数构造函数来实例化一个新的 T 类,很好。

public interface IDatabase<T> where T : class, new()
{...}

但是具体类:

public class MyDatabase<T> : IDatabase<T> where T : class, new()
{
public MyDatabase(string conString)
{...}
}

问题

1 - 如果第一个冒号表示 MyDatabase 是实现 IDatabase 接口(interface),为什么还需要第二个冒号再次指定接口(interface)的约束条件?

2 - 内部构造函数 public MyDatabase(string conString) 是对接口(interface)的重写,如果是这样,那么第二个冒号就没有必要了,对吧?

最佳答案

1 - if the first colon means MyDatabase is to implement the IDatabase interface, why still needs the second colon to specify the interface's constraints again?

T 的这两个类型参数声明是两个完全不同的东西,都命名为 T。第一个 T 有一个要求:作为接口(interface)的类型参数提供的任何类型都必须满足这些条件。然后你使用了一个不同的东西,也叫 T 它应该满足这些条件。如果您没有 where 子句,那么我们无法保证类中的 T 会真正满足接口(interface)要求的条件!

is the inside constructor public MyDatabase(string conString) an override to the interface, if so then the second colon is not necessary, right?

我不明白这个问题。我不知道“接口(interface)覆盖”是什么意思。

从评论到另一个答案:

If the interface already specifies the constraints, why does an implementing class of this interface should repeat those constraints again? Of course there cannot be a right answer to this question here. This should be addressed to the people at Microsoft that decided to implement it that way, everything else is just speculation.

好吧,我就是那个人,我写了一篇关于这个的文章:

https://ericlippert.com/2013/07/15/why-are-generic-constraints-not-inherited/

关于c# - 为什么非无参数构造函数仍然可以?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42320609/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com