编译器错误 CS0029:无法隐式转换为 uint
Compiler Error CS0029: Could not implicitly convert to uint
有很多关于 implicitly convert
的问题,但其中 none 为我提供了一些线索来解决这个问题。
所以要多谈谈我得到的这个问题。
我在我的项目中使用 VulkanSharp 绑定。我在编写渲染器代码时遇到了奇怪的异常情况,这让我感到震惊。
uint _queueFamilyUsedIndex;
var _deviceInfo = new DeviceCreateInfo
{
EnabledExtensionNames = new string[] { "VK_KHR_swapchain" },
QueueCreateInfoCount = new DeviceQueueCreateInfo { QueueFamilyIndex = _queueFamilyUsedIndex }
};
这部分代码让这个变得困难:
QueueCreateInfoCount = new DeviceQueueCreateInfo { QueueFamilyIndex = _queueFamilyUsedIndex }
我确实检查了这些变量需要什么类型,知道你做得很好很奇怪。
这些是 类:
public class DeviceCreateInfo : MarshalledObject
{
public DeviceCreateInfo();
public uint Flags { get; set; }
public uint QueueCreateInfoCount { get; set; }
public DeviceQueueCreateInfo[] QueueCreateInfos { get; set; }
public uint EnabledLayerCount { get; set; }
public string[] EnabledLayerNames { get; set; }
public uint EnabledExtensionCount { get; set; }
public string[] EnabledExtensionNames { get; set; }
public PhysicalDeviceFeatures EnabledFeatures { get; set; }
public override void Dispose(bool disposing);
}
public class DeviceQueueCreateInfo : MarshalledObject
{
public DeviceQueueCreateInfo();
public uint Flags { get; set; }
public uint QueueFamilyIndex { get; set; }
public uint QueueCount { get; set; }
public float[] QueuePriorities { get; set; }
public override void Dispose(bool disposing);
}
正如所见,这些类型是正确的。
这里的问题是您定义了数据类型 uint
的 field/property QueueCreateInfoCount
,而在代码中您试图放置 DeviceQueueCreateInfo
类型的对象,这将不起作用显然 C# 是强类型语言。
我认为你的意图是这样写:
QueueCreateInfos = new DeviceQueueCreateInfo[]
{
new DeviceQueueCreateInfo
{
QueueFamilyIndex = _queueFamilyUsedIndex
}
}
根据我的理解,您需要使用另一个 属性 将其保存在数组集合中:
// it looks like you don't need this one there
public uint QueueCreateInfoCount { get; set; }
// but may be you need to use this one
public DeviceQueueCreateInfo[] QueueCreateInfos { get; set; }
有很多关于 implicitly convert
的问题,但其中 none 为我提供了一些线索来解决这个问题。
所以要多谈谈我得到的这个问题。 我在我的项目中使用 VulkanSharp 绑定。我在编写渲染器代码时遇到了奇怪的异常情况,这让我感到震惊。
uint _queueFamilyUsedIndex;
var _deviceInfo = new DeviceCreateInfo
{
EnabledExtensionNames = new string[] { "VK_KHR_swapchain" },
QueueCreateInfoCount = new DeviceQueueCreateInfo { QueueFamilyIndex = _queueFamilyUsedIndex }
};
这部分代码让这个变得困难:
QueueCreateInfoCount = new DeviceQueueCreateInfo { QueueFamilyIndex = _queueFamilyUsedIndex }
我确实检查了这些变量需要什么类型,知道你做得很好很奇怪。
这些是 类:
public class DeviceCreateInfo : MarshalledObject
{
public DeviceCreateInfo();
public uint Flags { get; set; }
public uint QueueCreateInfoCount { get; set; }
public DeviceQueueCreateInfo[] QueueCreateInfos { get; set; }
public uint EnabledLayerCount { get; set; }
public string[] EnabledLayerNames { get; set; }
public uint EnabledExtensionCount { get; set; }
public string[] EnabledExtensionNames { get; set; }
public PhysicalDeviceFeatures EnabledFeatures { get; set; }
public override void Dispose(bool disposing);
}
public class DeviceQueueCreateInfo : MarshalledObject
{
public DeviceQueueCreateInfo();
public uint Flags { get; set; }
public uint QueueFamilyIndex { get; set; }
public uint QueueCount { get; set; }
public float[] QueuePriorities { get; set; }
public override void Dispose(bool disposing);
}
正如所见,这些类型是正确的。
这里的问题是您定义了数据类型 uint
的 field/property QueueCreateInfoCount
,而在代码中您试图放置 DeviceQueueCreateInfo
类型的对象,这将不起作用显然 C# 是强类型语言。
我认为你的意图是这样写:
QueueCreateInfos = new DeviceQueueCreateInfo[]
{
new DeviceQueueCreateInfo
{
QueueFamilyIndex = _queueFamilyUsedIndex
}
}
根据我的理解,您需要使用另一个 属性 将其保存在数组集合中:
// it looks like you don't need this one there
public uint QueueCreateInfoCount { get; set; }
// but may be you need to use this one
public DeviceQueueCreateInfo[] QueueCreateInfos { get; set; }