C# 根据流程架构更改变量类型和值

C# 根据流程架构更改变量类型和值,c#,C#,我有两个预定义的结构 Context // x86 Context64 // x64 我正在尝试基于流程架构创建其中一个结构的实例。例如,如果它被编译为x86,它将创建一个Context实例,如果它被编译为x64,它将创建Context64实例 我很难形成一个语句,根据程序编译的内容在两个实例之间交换 到目前为止,我已经尝试了以下方法 var compiledAsx64 = Environment.Is64BitProcess; var context = compiledAsx64 ? n

我有两个预定义的结构

Context // x86
Context64 // x64
我正在尝试基于流程架构创建其中一个结构的实例。例如,如果它被编译为x86,它将创建一个Context实例,如果它被编译为x64,它将创建Context64实例

我很难形成一个语句,根据程序编译的内容在两个实例之间交换

到目前为止,我已经尝试了以下方法

var compiledAsx64 = Environment.Is64BitProcess;

var context = compiledAsx64 ? new Context64() : new Context();

但是,这两个函数都返回错误,指出两者之间没有隐式转换


我试图避免使用多个变量。这可能吗?如果可能,我如何实现它?

编译器需要为条件运算符的返回确定一个公共类型?..:。结果将被指定给一个动态对象没有任何区别

保持条件运算符的最简单方法可能是Context64和实现公共接口的内容

更容易的是使用语句

dynamic context;
if (Environment.Is64BitProcess) {
  context = new Context64();
} else {
  context = new Context();
}

对目标类型施放其中一个,你就可以开始了

dynamic context = compiledAsx64 ? (dynamic)new Context64() : new Context();
为什么??Per:

第一个_表达式和第二个_表达式的类型必须相同,或者必须存在从一种类型到另一种类型的隐式转换

不过,更好的方法是使用if,这样您就可以拥有类型安全性。请参见以下问题:。因此,您的代码如下所示:

#if X64
var context = new Context64();
#else
var context = new Context();
#endif

请问什么是Context和Context64结构?唯一可以包含这两种结构的变量类型是object,然后您将不断地装箱/拆箱以使用它。若它们是类,那个么可能会有一些继承技巧。这个问题和处理器架构根本并没有关系。您试图将变量设置为不同的类型取决于您需要此功能的位置,您可以引入一个编译器开关,类似于如果x86 var a=Context ELSE var a=Context64。没有一个结构类型的变量可以保存这两种类型的值,您需要选择多个变量,或者接受将它们装箱到对象中的结果。对于后者,您可以使用接口,将它们转换为类,或者使用动态的不同选择,不同的性能特征。上下文是结构,我不建议仅仅为了使用条件运算符而实现公共接口。@Reniuz别忘了动态实际上是对象加元数据和反射:即,更高的开销。最佳答案取决于上下文/上下文64的用途。同意,这取决于用例。if X64部分将仅在编译期间使用,如果您创建的任何cpu应用程序可以在64位操作系统上以64位运行,在32位操作系统上以32位运行,您仍将在编译时选择要使用的结构,或者,您还必须提供应用程序的32位和64位副本。
#if X64
var context = new Context64();
#else
var context = new Context();
#endif