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

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#是否需要在泛型函数上增加啥约束或者声明?

阅读 856
1 个回答

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

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

interface MyInterface
{
    Name { get; set; }
}

Test<T>(ref T structT) where T : MyInterface
{
    structT.Name = "some";
}
logo
Microsoft
子站问答
访问
宣传栏