🙌

Constructors of types with required members are not supported.の解決方法

2024/04/06に公開

はじめに

Claudiaを使用していたところ、Rider上で以下のようなエラーが発生しました。

Rider上のエラー文1
コンストラクター 'Claudia.Message.Message()' は古い形式です: Constructors of types with required members are not supported in this version of your compiler.
Rider上のエラー文2
コンストラクター 'Claudia.MessageRequest.MessageRequest()' は古い形式です: Constructors of types with required members are not supported in this version of your compiler.

UnityEditor上ではエラーが発生しなかったため、そのまま使用していましたが、気になったので調査してみました。この記事では、エラーの原因と解決方法を紹介します。

エラーが発生したコード

以下のコードを実行した際に、上記のエラーが発生しました。

エラーが発生したコード
var input = new Message
{
    Role = Roles.User,
    Content = instructionField.text,
};

var message = await anthropic.Messages.CreateAsync(new()
{
    Model = Models.Claude3Haiku,
    MaxTokens = 1024,
    System = FunctionTools.SystemPrompt,
    StopSequences = new[] { StopSequnces.CloseFunctionCalls },
    Messages = new[] { input },
});

原因

エラーが発生したコードで使用されているMessageクラスを確認してみると、以下のようなコードになっていました。

Message
namespace Claudia
{
    [RequiredMember]
    public record Message()
    {
        // ...
    }
}

ここで使用されている[RequiredMember]属性がエラーの原因でした。[RequiredMember]は、C# 11で導入された新しい属性であり、レコードのプロパティやコンストラクターの引数に適用することで、そのメンバーが必須であることを示すことができます。
https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/keywords/required
プロジェクトのC#のバージョン(LangVersion)が10以前に設定されていたため、[RequiredMember]属性がサポートされておらず、エラーが発生していたのです。

解決方法

解決方法は簡単です。プロジェクトのC#のバージョンを11以降に変更するだけで、エラーが解消されます。

具体的には、Assets直下にあるLangVersion.propsファイルを開き、<LangVersion>タグの値を11に変更します。なければ、LangVersion.propsを追加する必要があります。

変更後のLangVersion.prop
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <LangVersion>11</LangVersion>
    <Nullable>enable</Nullable>
  </PropertyGroup>
</Project>

変更後、エラーが解消されます。

おわりに

今回は、'Constructors of types with required members are not supported in this version of your compiler'エラーの原因と解決方法を紹介しました。
さて、記事を書いての疑問ですがUnityはLangVersionがcsc.rspで10に設定されているはずです。なぜ、Unityではエラーが起きないのかが疑問に残っています。

Discussion