gpt4 book ai didi

c# - 具有泛型参数的接口(interface)与具有泛型方法的接口(interface)

转载 作者:IT王子 更新时间:2023-10-29 04:05:02 26 4
gpt4 key购买 nike

假设我有这样的接口(interface)和具体实现

public interface IMyInterface<T>
{
T My();
}

public class MyConcrete : IMyInterface<string>
{
public string My()
{
return string.Empty;
}
}

所以我为 strings 创建了 MyConcrete 实现,我可以为 int 提供一个更具体的实现.没关系。但是假设我想做同样的事情,但是使用通用方法,所以我有

public interface IMyInterface2
{
T My<T>();
}

public class MyConcrete2 : IMyInterface2
{
public string My<string>()
{
throw new NotImplementedException();
}
}

所以我有相同的IMyInterface2 , 但它通过 T My<T>() 定义了通用行为.在我的具体类(class)中,我想实现 My行为,但对于具体数据类型 - string .但是 C# 不允许我这样做。

我的问题是为什么我不能这样做?换句话说,如果我可以创建 MyInterface<T> 的具体实现作为MyClass : MyInterface<string>并在此时停止通用性,为什么我不能用通用方法做到这一点 - T My<T>()

最佳答案

您的泛型方法实现也必须是泛型的,因此它必须是:

public class MyConcrete2 : IMyInterface2
{
public T My<T>()
{
throw new NotImplementedException();
}
}

为什么你做不到 My<string>()这里?因为接口(interface)契约需要一个方法,可以用任何类型参数调用 T并且您必须履行该契约(Contract)。

为什么你不能在这一点上停止通用性因为它会导致如下情况:

类声明:

public interface IMyInterface2
{
T My<T>(T value);
}

public class MyClass21 : IMyInterface2
{
public string My<string>(string value) { return value; }
}

public class MyClass22 : IMyInterface2
{
public int My<int>(int value) { return value; }
}

用法:

var item1 = new MyClass21();
var item2 = new MyClass22();

// they both implement IMyInterface2, so we can put them into list
var list = new List<IMyInterface2>();
list.Add(item1);
list.Add(item2);

// iterate the list and call My method
foreach(IMyInterface2 item in list)
{
// item is IMyInterface2, so we have My<T>() method. Choose T to be int and call with value 2:
item.My<int>(2);

// how would it work with item1, which has My<string> implemented?
}

关于c# - 具有泛型参数的接口(interface)与具有泛型方法的接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17596186/

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