C# 隐式强制转换运算符未在原始程序集外部编译
隐式强制转换运算符在声明类型的程序集中工作正常,但在引用原始程序集的外部程序/库中使用时却不正常 假设我有这个结构:C# 隐式强制转换运算符未在原始程序集外部编译,c#,.net,c#-7.2,C#,.net,C# 7.2,隐式强制转换运算符在声明类型的程序集中工作正常,但在引用原始程序集的外部程序/库中使用时却不正常 假设我有这个结构: public readonly struct Tensor { public readonly IntPtr Ptr; // Other stuff here.. public static unsafe implicit operator float*(in Tensor tensor) => (float*)tensor.Ptr.ToPoin
public readonly struct Tensor
{
public readonly IntPtr Ptr;
// Other stuff here..
public static unsafe implicit operator float*(in Tensor tensor) => (float*)tensor.Ptr.ToPointer();
}
当从同一个组件中使用时,此功能非常好,即,我可以:
// Say t is a Tensor
float* p = t;
但是,如果我尝试从另一个程序/任何引用程序集Tensor
的程序中执行相同的操作,则编译器将无法执行以下操作:
错误CS0029:无法将类型“Tensor”隐式转换为“float*”
奇怪的是Visual Studio在IDE本身中没有显示任何类型的错误,在那里一切看起来都很好:
另外,在错误列表选项卡中,我没有得到任何关于此的错误,我只能通过查看编译器输出控制台来查看这些错误消息
这似乎不对:
- 为什么在最初的装配中可以正常工作李>
- 既然VS没有编译,为什么我在代码中没有从VS得到任何视觉错误指示
Tensor
struct位于NeuralNetwork.NET项目的API\Structs下。你可以在其他任何项目中尝试,隐式转换对我来说总是失败的
编辑#2:我打开了一个问题,这里是链接:您是否签入了另一个程序集的
允许不安全代码
生成属性?如果没有,我会先试试。似乎和新的“in”修饰符有关,因为如果删除它,编译就很好了。甚至可能是一个bug,所有这些对语言的快速新更改都比以前更频繁地出现。@Evk这很奇怪,我已经将C#7.2设置为解决方案中的所有项目。另外,删除修饰符中的并不是理想的解决方案,因为每次都会复制所有的struct值。您可能是对的,这可能是编译器的一个bug,并且考虑到ref-struct
修饰符也有bug,这不会让我感到惊讶。我会尝试报告的,谢谢!当然,我不建议删除它(如果只是暂时的,直到你找到真正的原因,或者如果这是一个错误,它是固定的)。您可以尝试在此处报告:,但请注意,此处有4000个未解决的问题,因此不要期望非常快的回复和修复:)@Evk Woah,以前从未见过有这么多未解决问题的回购交易啊哈,我将尝试在此处报告,并通过VS发送反馈消息,感谢您的建议!