【发布时间】:2015-10-18 14:37:09
【问题描述】:
以下代码是我的程序和类重现失败的重要部分:
using namespace System;
generic <class T>
ref class gener
{
public:
void func1g (T value)
{
Console::WriteLine (value);
int iValue = static_cast<int>(value);
if (iValue <= 0) return;
func2 ();
}
void func2 ()
{
T value = (T)(Object^)0;
func1g (value);
}
};
int main()
{
gener<int>^ g = gcnew gener<int>;
int iValue = 1;
g->func1g (iValue); // <<=== System.TypeLoadException
return 0;
}
当调用func1g 时,我得到一个System.TypeLoadException。我只是不明白为什么。
是不是因为func2没有泛型参数?
这是完整的错误消息(德语,但它只是说“未处理的异常”和“无法加载”;没有详细信息):
C# 中的等效代码有效:
public class gener<T>
{
public void func1g(T value)
{
Console.WriteLine(value);
int iValue = Convert.ToInt32(value);
if (iValue <= 0) return;
func2();
}
public void func2()
{
T value = (T)(object)0;
func1g(value);
}
};
internal class Program
{
private static void Main()
{
gener<int> g = new gener<int>();
int iValue = 1;
g.func1g(iValue);
return;
}
}
编辑
我找到了一种“解决方法”,请参阅下面的答案,但我不知道为什么会这样。
如果有人能向我解释此失败的原因和解决方法的功能,我将不胜感激。
编辑 2
如果您想重现此内容:我使用 VS 2008 SP1。
我希望它不再像我上一期那样与编译器相关,尽管我个人认为这很有可能......
【问题讨论】:
-
异常究竟是发生在
g->func1g (iValue);还是发生在func1g的某个地方? -
@crashmstr:它恰好发生在这一行。函数本身没有“打开”。
-
异常消息中是否有任何内容?可能有帮助:What could be causing a System.TypeLoadException?
-
@crashmstr:如果您还没有注意到:请查看编辑和我的答案。
-
static_cast<int>(value)绝对不等同于Convert.ToInt32(value)。那将是Convert::ToInt32(value),我猜你应该在这里使用那个。在 C# 中,static_cast<int>(value)的等价物是(int)value,它一开始就无法编译。泛型不是模板:)