当前位置: 首页 > 知识库问答 >
问题:

c# - C# 泛型函数CS1061报错是为啥 ?

羊舌承颜
2024-04-04

C# CS1061是什么原因?

我写了一个函数模板

Test<T>(ref T structT){    structT.name = “some”;}

我编写此模版方法后尝试传入structT调用中,我确保我的structT中绝对含有name字段,但是编译依然报错:
error:CS1061,T未包含name的定义,并且找不到可接受第一个"T"类型参数的可访问方法"name"(是否缺少using指令或程序集引用)
而后我注释了调用部分,即没有任何地方调用我的Test<T>(ref T structT),仅仅只有此函数的声明依然报此错误,很费解。

我按照C++的思路去理解模板,Test<T>(ref T structT)如果仅声明并不会实例化,只有在调用时根据参数类型实例化T,判断T有无name字段;如果没有调用,不应当编译,但是在C#中没有调用也报错了,说明和C++的编译思路不一样,并且也应当和我实际传入的参数有无name属性无关,C#是否需要在泛型函数上增加啥约束或者声明?

共有1个答案

景品
2024-04-04

C++ 模板和 C# 泛型实现参数化类型的思路完全不一样,没法直接比较。

具体到本题来说的话,你需要声明一个接口出来,来作为泛型约束。

interface MyInterface{    Name { get; set; }}Test<T>(ref T structT) where T : MyInterface{    structT.Name = "some";}
 类似资料:
  • 主要内容:泛型的特性,泛型方法,泛型委托在 C# 中,泛型(Generic)是一种规范,它允许我们使用占位符来定义类和方法,编译器会在编译时将这些占位符替换为指定的类型,利用泛型的这一特性我们可以定义通用类(泛型类)或方法(泛型方法)。 定义通用类需要使用尖括号 ,这里的尖括号用于将类或方法声明为泛型。下面通过一个简单的示例来帮助您理解这个概念: 允许结果如下: 小牛知识库 1234567 C 泛型的特性 可以将泛型看作是一种增强程序功

  • 本文向大家介绍C# 泛型参数转换,包括了C# 泛型参数转换的使用技巧和注意事项,需要的朋友参考一下 泛型不同参数类型生成的对象是相互独立的。 很多时候,我们希望实现 to = ts 这种操作,为什么?因为看上去它应该如此。 为了达到这个目的,就要解决“泛型参数转换的问题”,这个问题的知识点是in out 泛型变体。老实说,这个问题本身不困难,只是非常不直观,很容易让人忘记。 首先一点,为了实现to

  • 问题内容: 我正在使用VS2008Express在NET3.5SP1中构建winForms应用程序。我正在尝试使用System.Web.Script.Serialization库反序列化对象。 错误是:数组反序列化不支持类型’jsonWinForm.Category’。 干杯! 问题答案: 很高兴您发现自己的错误。如果您正在寻找用于JSON序列化的其他工具,则可能需要尝试JSON.Net。

  • 泛型允许推迟类或方法中编程元素的数据类型规范的编写,直到实际在程序中使用它的时候再编写。换句话说,泛型允许编写一个可以与任何数据类型协作的类或方法。 你可以通过数据类型的替代参数来编写类或方法的规范。当编译器遇到类的构造函数或方法的函数调用时,它会生成代码来处理指定的数据类型。下面这个简单的示例将有助于理解这个概念: using System; using System.Collections.G

  • 我是从C++模板编程来的,有时会对泛型感到很困惑。由于没有方法专门化,我尝试使用了强制转换。以下是我的资料: 这不编译。 有什么办法可以让我做这个演员吗? 我想这样做的原因是:在C++模板中,我会为所支持的类型进行专门化,并创建一个抛出异常的非专门化版本。 其基本思想是:具有泛型方法的非泛型接口。尝试使用正确的类型获取值应该有效,尝试使用错误的类型则可能引发。 我们应该保持类型安全,所以我需要返回

  • 同样的规则也可以适用于函数:在使用前给出 <T> 后,类型 T 就变成了泛型。 使用泛型函数有时需要显式地指明类型参量。这种可能的情况包括,调用返回类型是泛型的函数,或者编译器没有足够的信息来推导类型参量。 函数调用使用显式指定的类型参量,如下所示: fun::<A, B, ...>(). struct A; // 具体类型 `A`。 struct S(A); //