为什么C ++ / CLI编译器不会为Obsolete属性调用生成警告?

时间:2015-02-11 17:02:42

标签: .net c++-cli compiler-warnings api-design

我从某些C ++ / CLI代码引用第三方.NET库。我的C ++ / CLI调用代码引用了一个使用Obsolete属性在C#库中标记为Obsolete的属性:

// C# External library code
using System;
namespace ExternalLibrary
{
    public class Dependency
    {
        [Obsolete("Please use the new version.")]
        public static bool IsInitialized
        {
            get { return true; }
        }
    }
}

但是,当我编译使用该属性的C ++ / CLI调用代码时,即使我将警告级别设置为/Wall EnableAllWarnings,它也不会生成任何过时/不赞成的警告(例如C4947)。

如果我从C#代码引用相同的API,我会收到预期的CS0618警告,告诉我该属性已过时,但是当我编译C ++ / CLI代码时,我没有收到任何废弃或弃用警告。

// C# Calling code (in another assembly)
namespace CalledFromCSharp
{
    public class CSharpCode
    {
        public static void CallingCode()
        {
            // Generates warning CS0618:
            //   'ExternalLibrary.Dependency.IsInitialized' is obsolete:
            //   'Please use the new version.'
            bool initialized = ExternalLibrary.Dependency.IsInitialized;
        }
    }
}
// C++/CLI Calling code (also in another assembly)
#pragma once
using namespace System;
namespace CppCode
{
    public ref class CalledFromCpp
    {
        static void CallingCode()
        {
            // NO OBSOLETE WARNING GENERATED
            bool isInitialized = ExternalLibrary::Dependency::IsInitialized;
        };
    };
}

这似乎发生在静态和非静态属性调用中。我需要在C ++ / CLI项目中设置一些额外的东西(使用Visual Studio 2013)以获得显示的相应警告吗?或者是否存在当前行为的原因?

1 个答案:

答案 0 :(得分:3)

Hmya,不喜欢成为坏消息的承载者,但C ++ / CLI设计师的属性不同。从他们的语法中可以明显看出,他们在许多选择中偏爱“类似于C ++”的方法。最好通过修改代码片段来证明:

public ref class CalledFromCpp {
public:
    static property bool Foo {
        [Obsolete("This works")]
        bool get() { return false; }
    }
    [Obsolete("This doesn't work")]
    static property bool Bar {
        bool get() { return false;  }
    }
    static void CallingCode() {
        bool test1 = CalledFromCpp::Foo;   // Yes
        bool test2 = CalledFromCpp::Bar;   // Nope
        bool test3 = ExternalLibrary::Dependency::IsInitialized;  // Nope
    }
};

您不能在C#属性上执行相同的操作,它不允许您在getter上应用[Obsolete]属性。没有解决方法。