16

私は C# クラスを使用していますが、Windows ストア アプリ (C#) では問題なく動作します。しかし、Windows ランタイム コンポーネントで使用しようとすると、次のエラーが発生します。

Calculator.Calculate(System.DateTime)' には、'System.DateTime' 型のパラメーター 'dateTime' があります。'System.DateTime' は、有効な Windows ランタイム パラメーターの型ではありません。

クラスのサンプル オブジェクト:

public DateTime Calculate(DateTime dateTime)
{
   int dayNumberOfDateTime = ExtractDayNumber(dateTime);
   int sunRiseInMinutes = CalculateSunRiseInternal(tanSunPosition, differenceSunAndLocalTime);
   return CreateDateTime(dateTime, sunRiseInMinutes);
}

どうすればこれを修正できますか? そして、問題は何ですか?

4

2 に答える 2

30

Windows ランタイム コンポーネントを作成すると、Javascript や C++ など、管理されていない言語でコンポーネントを使用できます。明らかに、これらの言語には適切な System.DateTime を生成する方法がわかりません。これは特定の .NET 型です。

したがって、このようなコンポーネントはネイティブの WinRT 型のみを使用する必要があり、それ以外の場合は WinRT に存在する制限に従う必要があります。最初から遭遇するそのような制限の 1 つは、WinRT が実装の継承をサポートしていないことです。これには、クラスをsealと宣言する必要があります。

ネイティブの WinRT 型は、.NET 型とは大きく異なります。日付を格納できる実際のランタイム型は Windows.Foundation.DateTime です。文字列は、実際には HSTRING ハンドルです。List は実際には IVector です。など。

言うまでもなく、これらのネイティブ型を実際に使用する必要がある場合、そのプログラムはもはや .NET プログラムに似ていません。And you don't, the .NET 4.5 version of the CLR has a language project built in. コードは、WinRT 型を同等の .NET 型に自動的に変換します。その翻訳にはいくつかの粗いエッジがあり、一部のタイプは簡単に置き換えることができません。しかし、それらの大部分は問題なくマッピングされます。

System.DateTime は、そのような粗いエッジの 1 つです。Windows.Foundation.DateTime の言語射影は System.DateTimeOffset です。したがって、次のようにメソッドを宣言して問題を解決するだけです。

public DateTimeOffset Calculate(DateTimeOffset dateTime) {
    // etc..
}

注目に値する唯一の他のポイントは、これは他のコードが使用する可能性のあるメンバーにのみ必要であるということです。パブリック メンバー。

于 2012-12-08T16:00:44.483 に答える
1

以下のように、Windows ランタイム コンポーネントでも同じ問題に直面していました。

Severity Code Description Project File Line Suppression State
Error Method '.put_TxPower(System.SByte)' has parameter 'value' of type 'System.SByte'.  
System.SByte' is not a valid Windows Runtime parameter type.

Lukasz Madon がコメントで述べたように、アクセス修飾子をpublicからinternalに変更するとうまくいきました。

前:

public sbyte TxPower { get; set; }

後:

internal sbyte TxPower { get; set; }
于 2018-11-28T09:21:28.903 に答える