gpt4 book ai didi

c# - 键入通用值 (C#)

转载 作者:可可西里 更新时间:2023-11-01 08:01:08 27 4
gpt4 key购买 nike

当我尝试使用 this.value 为 T 的泛型类时:

if (this.value.GetType() == typeof(int))
{
((int)this.value)++;
}
else
{
throw new InvalidOperationException
("T must be an int to perform this operation");
}

我收到编译时错误:“无法将类型‘T’转换为‘int’”

this.value 是 int 时,如何对其进行整型运算?

请注意,这只是一个示例。该代码使用泛型进行类型转换,“int”只是 T 的一种类型的示例。

最佳答案

不幸的是,很难让编译器接受特定的 T 实现。一种(讨厌的)方法是转换为中间的对象(注意这将装箱和拆箱值类型):

int i = (int)(object)this.value;
i++;
this.value = (T)(object)i;

丑陋但有效。在 .NET 3.5 中,我有一些更好的通用算法包装器,here . Operator 类是 MiscUtil 的一部分;在最简单的层面上,我怀疑 AddAlternative 会工作得很好:

this.value = Operator.AddAlternative(this.value, 1);

这应该自动推断隐式 ,或者您可以自己添加它们:

this.value = Operator.AddAlternative<T,int>(this.value, 1);

好处:这比原始代码更可取,因为它实际上并不关心原始 T - 它适用于支持“T +(T,整数)”。

我认为还有一个 ChangeType 隐藏在某处......

[edit] Collin K 和其他人对架构的影响做出了有效的评论——但出于务实的考虑,有时 T 确实非常重要……但我同意避免这种类型的特化,除非 真的有必要。也就是说(根据我对 Collin 的帖子的评论),能够在(例如)一个 Matrix [for T in decimal/float/int/double/etc] 通常非常有值(value)。

关于c# - 键入通用值 (C#),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/172600/

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