我正在使用Visual Studio 2015(Windows)编写Xamarin Android应用程序。我想以最新的Android API为目标,同时保持与API 16(4.1 Jelly Bean)的向后兼容性。
我知道如何通过API级别检查确保不会引发运行时错误:
if(Android.OS.Build.VERSION.SdkInt >= BuildVersionCodes.Lollipop)
{
//Call API supported by Lollipop and above, but not by lower API's
}
else
{
//Alternative code for graceful backwards compatibility
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,如果我没有进行此检查,Visual Studio仍然会愉快地编译并运行我的代码-如果不支持该API,则会收到运行时Java.Lang.NoSuchMethodError异常。我可以手动将项目重置为较低级别的API,以捕获编译时的错误,但这有点麻烦-在编译时捕获这些错误(即使是警告)也很不错,而无需手动将其重置为较低的版本我想支持的API。
如何在编译时检测到不兼容的API调用?
注意:我确实在StackOverflow上找到了类似的问题,但是它专门针对Mac的Xamarin Studio-这表明这应该可以在Visual Studio 2015 for Windows中完成(2017解决方案也可以)。
考虑这个 C++ 代码片段:
std::vector<Foo> bar;
bar.emplace_back(9001); //Foo defines a constructor that takes int
Run Code Online (Sandbox Code Playgroud)
这将创建一个 type 对象Foo,传递任何构造函数参数,并将新对象存储在向量中。功能上等价于bar.push_back(Foo(9001));,但效率更高,因为没有Foo创建临时文件。
有没有办法在 C# 中实现类似的功能?
如果是这样,它会提供任何真正的好处,就像在 C++ 中一样,还是只是语法糖?
编辑:这个问题特别是关于 C#(结构)中的值类型集合;我正在寻找的好处(除了简化的Add语法)类似于 C++11emplace方法的好处- 无需构造、复制和销毁 (GC) 临时对象。