gpt4 book ai didi

c# - 为什么在此示例中需要 "where T : class"?

转载 作者:太空狗 更新时间:2023-10-30 00:49:50 25 4
gpt4 key购买 nike

示例代码:

using System.Collections.Generic;
using FileHelpers;

....
private void Save<T>(string destFilename, IEnumerable<T> data) where T : class
{
var engine = new FileHelperEngine((typeof(T)));


engine.HeaderText = engine.GetFileHeader();
engine.WriteFile(destFilename, data); // XX
}

在第 XX 行,engine.WriteFile 的第二个参数需要一个 IEnumerable。这段代码工作正常。

我的问题是,为什么方法需要“where T : class”约束?如果我删除它,我会得到编译时错误:

Argument 2: cannot convert from
'System.Collections.Generic.IEnumerable<T>' to
'System.Collections.Generic.IEnumerable<object>'

我会认为一切都是一个“对象”,所以约束是不必要的?

最佳答案

需要约束,因为 object仅是引用类型;值类型可以分配给 object 的原因是由于装箱(尽管从技术上讲,所有类型都继承自 System.Object )。

但装箱与类型参数变化是不同的问题;一个IEnumerable<T>具有不受约束的 T 不能转换为 IEnumerable<object>因为值类型不支持方差。

顺便说一句,FileHelperEngine<T> , 非泛型 FileHelperEngine继承自(如 FileHelperEngine<object> ),也有一个 T : class约束。所以你不会因为有约束而错过任何功能,因为无论如何只支持引用类型——理论上可以只使用 FileHelperEngine<T>直接而不通过非泛型类,因为示例中给出的方法已经是泛型的:

using System.Collections.Generic;
using FileHelpers;

....
private void Save<T>(string destFilename, IEnumerable<T> data) where T : class
{
var engine = new FileHelperEngine<T>();


engine.HeaderText = engine.GetFileHeader();
engine.WriteFile(destFilename, data);
}

关于c# - 为什么在此示例中需要 "where T : class"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35907892/

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